简体   繁体   English

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

[英]Two same arrays but contains method not working

I have a SmsClass: 我有一个SmsClass:

public class SmsClass {

private String numberInside;
private String name;


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

and I try to make two same ArrayList of this class: 并且我尝试制作此类的两个相同的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);

I have problem with .contains method . 我对.contains方法有问题。 When I run this code : 当我运行此代码时:

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

I have same arrays but nothing found. 我有相同的数组,但没有发现。

You should override this equals method like this in SmsClass ; 您应该在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;
    }
}

Just an idea, you can check easily without a for loop equations of two list . 只是一个想法,您可以轻松地检查两个list的for loop方程。

c1.removeAll(c2);
if (c1.isEmpty()) {
    System.out.println("victory!");
}

You must define equals in your Object. 您必须在对象中定义等于。
Something like this: 像这样:

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

You have not defined equals (and implicitly hashCode ), thus contains can not compare your Objects. 您尚未定义equals (并且隐式地contains hashCode ),因此contains无法比较您的对象。 In case you do not override those both method: Object::equals will be used (which just uses reference comparison, via == ) and hashCode (in java-8) will be computed as a pseudo-random number (based on Marsaglia XOR shift algorithm). 如果您不重写这两种方法:将使用Object::equals (仅通过==使用引用比较),并且hashCode (在Java-8中)将作为伪随机数计算(基于Marsaglia XOR移位算法)。

Variable names should not start with capital letter as recommendation. 变量名不应以大写字母开头。

Also, you added SmsClass1 , and SmsClass2 to c1 list, while adding SmsClass3 , and SmsClass4 to c2 list. 同样,您将SmsClass1SmsClass2添加到c1列表,同时将SmsClass3SmsClass4添加到c2列表。 Although, smsClass1 and smsClass3 have same values in their fields, they are stored on different part of memory. 尽管smsClass1smsClass3在其字段中具有相同的值,但它们存储在内存的不同部分。 ArrayList.contains() method check equality according to elements' references(where they placed in memory). 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM