Два одинаковых массива, но метод не работает - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть SmsClass:

public class SmsClass {

private String numberInside;
private String name;


public SmsClass( String numberInside ,String name) {
    this.numberInside = numberInside;
    this.name = name;
}

и я пытаюсь сделать два одинаковых ArrayList этого класса:

SmsClass SmsClass3 = new SmsClass("name" , "19");
SmsClass SmsClass4 = new SmsClass("name" , "19" );

ArrayList<SmsClass> c1 = new ArrayList<>();
ArrayList<SmsClass> c2 = new ArrayList<>();

c1.add(SmsClass1);
c1.add(SmsClass2);
c2.add(SmsClass3);
c2.add(SmsClass4);

У меня проблема с .contains методом. Когда я запускаю этот код:

for(int i = 0 ; i < c1.size() ; i++){
    if (c1.contains(c2.get(i))) {
        System.out.println("victory");
    }
}

У меня такие же массивы, но ничего не найдено.

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Вы должны переопределить этот метод равенства следующим образом в SmsClass;

public class SmsClass {

    private String numberInside;
    private String name;


    public SmsClass(String numberInside, String name) {

        this.numberInside = numberInside;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof SmsClass)) return false;

        SmsClass smsClass = (SmsClass) o;

        if (numberInside != null ? !numberInside.equals(smsClass.numberInside) : smsClass.numberInside != null)
            return false;
        return name != null ? name.equals(smsClass.name) : smsClass.name == null;
    }
}

Просто идея, вы можете легко проверить без for loop уравнений двух списков.

c1.removeAll(c2);
if (c1.isEmpty()) {
    System.out.println("victory!");
}
0 голосов
/ 13 сентября 2018

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

Кроме того, вы добавили SmsClass1 и SmsClass2 в список c1, добавляя SmsClass3 и SmsClass4 в c2 список. Хотя smsClass1 и smsClass3 имеют одинаковые значения в своих полях, они хранятся в разных частях памяти. ArrayList.contains() метод проверки равенства по ссылкам элементов (где они размещены в памяти).

SmsClass SmsClass3 = new SmsClass("name" , "19");
SmsClass SmsClass4 = new SmsClass("name" , "19" );

ArrayList<SmsClass> c1 = new ArrayList<>();
ArrayList<SmsClass> c2 = new ArrayList<>();

c1.add(SmsClass1);
c1.add(SmsClass2);
c2.add(SmsClass3);
c2.add(SmsClass4);
0 голосов
/ 13 сентября 2018

Вы должны определить равные в вашем Объекте.
Как то так:

public class SmsClass {

private String numberInside;
private String name;


public SmsClass( String numberInside ,String name){

    this.numberInside = numberInside;
    this.name = name;   }

public boolean equals(Object obj) {
   if(obj instanceof SmsClass ) {

            SmsClass smsObj = (SmsClass)obj;
            if(smsObj.getNumberInside() == this.getNumberInside() && 
               smsObj.getName() == this.getName())
                return true;
            }
                return false;
        }
}
0 голосов
/ 13 сентября 2018

Вы не определили equals (и неявно hashCode), поэтому contains не может сравнивать ваши объекты.В случае, если вы не переопределите эти оба метода: будет использоваться Object::equals (который просто использует сравнение ссылок через ==), а hashCode (в java-8) будет вычисляться как псевдослучайное число (на основеМарсалья XOR алгоритм сдвига).

...