Java равно методу. Как вернуть несколько логических значений, сравнивая каждый атрибут внутри объекта - PullRequest
0 голосов
/ 21 февраля 2020
import java.util.*;

public class Digimon1{

private String name;
private int hitPoints;
private double attackSpeed;

public Digimon1(String name, int hitPoints, double attackSpeed){
  this.name = name;
  this.hitPoints = hitPoints;
  this.attackSpeed = attackSpeed;

}
public String getName(){
   return this.name;
}
public double getAttackSpeed(){
   return this.attackSpeed;
}



public boolean equals(Object a){
   Digimon1 o = (Digimon1) a;
   if (this.name == o.getName() && this.attackSpeed == o.getAttackSpeed()){
      return true;
}else{
   return false;
     }
}
public static void main(String[] args){
   List <Digimon1> digimon = new ArrayList<>();
   Digimon1 gatamon = new Digimon1("Gatamon", 500, 12.9);
   digimon.add(gatamon);

   Digimon1 agumon = new Digimon1("agumon", 53, 9.8);//agumon
   digimon.add(gatamon);

  Digimon1 agumon1 = new Digimon1("agumon", 53, 9.8);//agumon1
  digimon.add(gatamon);

  System.out.print(agumon.equals(agumon1));



}


 }

Таким образом, мой метод с кодами должен вывести «true, false, true», когда 2 цифры имеют одинаковое имя и скорость атаки. Но я понимаю, что мои равные могут вернуться, если мой объект истинный или ложный. как мне вернуть три логических значения?

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Если я правильно вас понимаю, и вы просто хотите увидеть 3 логических результата. Это самый простой способ добиться этого.

Вы можете создать массив bool,

 boolean array[];
 array = new boolean[3];
  // then you can set the result to the array like this,

     if(this.name == o.getName())
            array[0] = true; 
    if(this.attackSpeed == o.getAttackSpeed())
            array[1] = true; 
//...

    return array;

и так далее. после контрольных заявлений. Я думаю, что вы можете написать целую версию, а затем вы можете вернуть свой массив

0 голосов
/ 21 февраля 2020

В других ответах уже указывалось, что вы не можете и не должны думать об использовании Object.equals для этого. Одним из решений является использование пользовательского метода, возвращающего логический массив, но вы также можете посмотреть EnumSets:

enum DigimonEquality {
    NAME, HP, ATTACK;
}

public class Digimon {

    private String name;
    private int hitPoints;
    private double attackSpeed;

    public Digimon(String name, int hitPoints, double attackSpeed) {
        super();
        this.name = name;
        this.hitPoints = hitPoints;
        this.attackSpeed = attackSpeed;
    }

    public EnumSet<DigimonEquality> checkEquality(Digimon that) {
        EnumSet<DigimonEquality> result = EnumSet.noneOf(DigimonEquality.class);
        if (this.name.equals(that.name))
            result.add(DigimonEquality.NAME);
        // etc.
        return result;
    }

    public static void main(String[] args) {
        List<Digimon> digimon = new ArrayList<>();
        Digimon gatamon = new Digimon("Gatamon", 500, 12.9);
        digimon.add(gatamon);

        Digimon agumon = new Digimon("agumon", 53, 9.8);// agumon
        digimon.add(gatamon);

        Digimon agumon1 = new Digimon("agumon", 53, 9.8);// agumon1
        digimon.add(gatamon);

        EnumSet<DigimonEquality> equality = agumon.checkEquality(agumon1);
        System.out.println(
                Arrays.stream(DigimonEquality.values()).map(equality::contains).collect(Collectors.toList()));

    }

}

Пользовательский метод также может принимать только Digimon st, который вам не нужно проверять / приводить тип, как в методе equals.

EDIT: поскольку OP борется с реализацией equals, и, возможно, люди, плохо знакомые с Java, читают это, я хочу добавить, что вы должны c также переопределить hashCode при переопределении equals

0 голосов
/ 21 февраля 2020

Вы можете реализовать Object#equals(Object obj), но вы не можете изменить количество аргументов или его сигнатуру. Реализуйте собственный метод, который проверяет несколько объектов, это может быть правильным способом.

...