Большая стоимость игральных карт в другом классе (JAVA)
Я пытаюсь сравнить две карты объекта и получить самую большую. Программа состоит из 2 классов, но я не могу понять, как получить наибольшее значение между 2 картами.
Класс 1 содержит этот кусок кода:
Pelikortti kortti1 = new Pelikortti("risti",7);
Pelikortti kortti2 = new Pelikortti("ruutu",8);
System.out.println(suurempi(kortti1,kortti2)); //expected: ruutu 8
Эта строка предназначена для печати ruutu 8
так как это карта с наибольшим значением. "suurempi" означает "больше" на моем языке.
Класс 2 выглядит так:
public class Pelikortti {
private String maa1;
private int arvo1;
public Pelikortti(String maa, int arvo){
if(parametritOK(maa,arvo)){
this.maa1 = maa;
this.arvo1 = arvo;
}else{
this.maa1 = "?";
this.arvo1 = -1;
}
}
public Pelikortti() {
this.maa1 = "?";
this.arvo1 = -1;
}
private static boolean parametritOK(String maa, int arvo){
return (maa.equals("risti")||maa.equals("ruutu")||
maa.equals("pata")||maa.equals("hertta"))
&& arvo > 1 && arvo < 15;
}
public void setKortti(String maa, int arvo){
if(parametritOK(maa,arvo)){
this.maa1 = maa;
this.arvo1 = arvo;
}else{
this.maa1 = "?";
this.arvo1 = -1;
}
}
public String getMaa() {
return maa1;
}
public int getArvo() {
return arvo1;
}
public int suurempi(Pelikortti kortti1, Pelikortti kortti2){
if(kortti1>kortti2){
return kortti1;
}
return kortti2;
}
public String toString(){
return(this.maa1 + " " + this.arvo1);
}
}
Второй класс также имеет много других методов, так как он является частью другого присваивания, но проблема здесь в том, что я не могу заставить работать метод сравнения при вызове из класса 1.
3 ответа
То, что вы хотите сравнить, это стоимость карты. И значение не сам объект карты, а атрибут, содержащий значение: arvo1
,
Поэтому вам нужно сравнить правильный атрибут каждого объекта: kortti1.arvo1
а также kortti2.arvo2
,
Обратите внимание, что этот атрибут является закрытым, вы не сможете получить к нему доступ напрямую из другого экземпляра, поэтому вам нужно будет использовать метод получения getArvo()
,
Также, suurempi
это не статический метод, его нужно вызывать из экземпляра класса. Так что для этого понадобится только один параметр (kortti2
) как kortti1
будет экземпляром, из которого вызывается метод.
Вам также необходимо изменить тип возвращаемого метода на Pelikortti
как вы хотите получить объект карты, а не только его значение (спасибо eltabo за редактирование)
public Pelikortti suurempi(Pelikortti kortti2){
if(this.arvo1>kortti2.getArvo()){
return this;
}
return kortti2;
}
Вызов метода:
System.out.println(kortti1.suurempi(kortti2));
РЕДАКТИРОВАТЬ:
Если звонок suurempi
должен быть из другого класса (давайте назовем это ClassA
) и следуйте этому синтаксису:
System.out.println(suurempi(kortti1,kortti2));
Это означает suurempi
определяется в ClassA
и не в Pelikortti
и вам нужно переместить свой код.
Тогда это очень похоже, за исключением вы не используете this
но правильный параметр.
public Pelikortti suurempi(Pelikortti kortti1, Pelikortti kortti2){
if(kortti1.getArvo()>kortti2.getArvo()){
return kortti1;
}
return kortti2;
}
Это потому, что вы сравниваете карты, а не значения карт
public static Pelikortti suurempi(Pelikortti kortti1, Pelikortti kortti2){
if(kortti1.getArvo()>kortti2.getArvo()){
return kortti1;
}
return kortti2;
}
Затем вы можете использовать функцию следующим образом:
System.out.println(Pelikortti.suurempi(kortti1,kortti2));
Проблема в том, что вы не можете напрямую сравнивать объекты, как если бы вы были целыми числами, и именно поэтому вы получаете ошибку компиляции в int suurempi(Pelikortti kortti1, Pelikortti kortti2)
Ваша цель - иметь System.out.println(suurempi(kortti1,kortti2));
распечатать ruutu 8
из класса 1.
Во-первых, метод int suurempi(Pelikortti kortti1, Pelikortti kortti2)
определяется на Pelikortti
и вызов сделан из класса 1 без использования Pelikortti
объект, поэтому метод не будет использоваться. Кроме того, он возвращает целое число, а не больше Pelikortti
,
Тогда, чтобы все было просто, давайте сделаем это suurempi
метод вернуть Pelikortti
объект, так что System.out.println
распечатывает самую большую карту, получая объект карты String
представление через его toString()
метод экземпляра, переопределенный из java.lang.Object
,
Решение
Нам нужно определить метод следующим образом в классе 1:
public Pelikortti suurempi(Pelikortti kortti1, Pelikortti kortti2) {
return kortti1.getArvo() >= kortti2.getArvo() ? kortti1 : kortti2;
}
Это предполагает, что вы звоните suurempi
из метода экземпляра класса 1, если вы вызываете его из статического метода, такого как public void main(String[] args)
тогда нужно сделать suurempi
статика тоже.
Больше по теме
Реализация сравнения, предложенная выше, возвращает первое Pelikortti
если карты имеют одинаковое значение (как это Math.max()
работает например), но вы можете посмотреть в интерфейсах java.lang.Comparable
а также java.util.Comparator
для стандартных способов сравнения объектов в Java, которые позволяют получить одинаковый результат, если две карты имеют одинаковое значение.