我有一个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");
}
}
我有相同的数组,但找不到任何内容。
答案 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
列表中添加了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);