两个相同的数组,但包含方法不起作用

时间:2018-09-13 08:45:55

标签: java arraylist contains

我有一个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 :(得分:3)

您应该在SmsClass中覆盖此equals方法;

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!");
}

答案 1 :(得分:2)

您必须在对象中定义等式。
像这样:

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;
        }
}

答案 2 :(得分:1)

您尚未定义equals(并且隐式定义了hashCode),因此contains无法比较您的对象。如果您不覆盖这两种方法,则将使用Object::equals(仅通过==使用引用比较),并且hashCode(在Java-8中)将被计算为伪-随机数(基于Marsaglia XOR移位算法)。

答案 3 :(得分:0)

变量名不应该以大写字母开头。

此外,您还向SmsClass1列表中添加了SmsClass2c1,同时向SmsClass3列表中添加了SmsClass4c2。尽管smsClass1smsClass3在其字段中具有相同的值,但它们存储在内存的不同部分。 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);