[英]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. 同样,您将SmsClass1
和SmsClass2
添加到c1
列表,同时将SmsClass3
和SmsClass4
添加到c2
列表。 Although, smsClass1
and smsClass3
have same values in their fields, they are stored on different part of memory. 尽管smsClass1
和smsClass3
在其字段中具有相同的值,但它们存储在内存的不同部分。 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.