Java ArrayList Contain始终返回false,尽管它包含相同的值
这是我的洞课Java ArrayList Contain始终返回false,尽管它包含相同的值,java,arraylist,contain,Java,Arraylist,Contain,这是我的洞课 class Hole { public int a; public int b; Hole(int a, int b) { this.a = a; this.b = b; } 因此,我添加了一个包含几个孔的ArrayList public void checkPathLoop(int x, int y) { //rough code ArrayList<Hole> leftFlowInnerHole = new
class Hole {
public int a;
public int b;
Hole(int a, int b) {
this.a = a;
this.b = b;
}
因此,我添加了一个包含几个孔的ArrayList
public void checkPathLoop(int x, int y) {
//rough code
ArrayList<Hole> leftFlowInnerHole = new ArrayList<>();
//left holes rules
leftFlowInnerHole.add(new Hole(0, 1));
leftFlowInnerHole.add(new Hole(1, 5));
leftFlowInnerHole.add(new Hole(5, 4));
leftFlowInnerHole.add(new Hole(0, 4));
它总是返回false!!它应该返回true
有什么我错过的吗
提前感谢contains()
方法在检查时检查对象上的equal()
方法
您必须验证equals方法才能使其工作
如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表包含至少一个元素e,使得(o==null?e==null:o.equals(e)),才返回true。
若您并没有验证equals方法,那个么默认的objectequals方法将执行,并且,按照equals方法的文档
类对象的equals方法实现了对象上最有区别的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时(x==y的值为true),此方法返回true。
因此,您的userInputHole==leftFlowInnerHole
始终为false,因为它们指向不同的实例
因此,为了避免默认的实现,您只需验证yout类中的等价项并提供您的实现
您需要重写
类中从对象
类继承的equals
方法(因此也要重写hashCode
以尊重契约,请参见)
如果此列表包含指定的元素,则返回true。更多
形式上,当且仅当此列表至少包含一个
元素e使得(o==null?e==null:o.equals(e)
)
基本上,默认的equals
实现是两个对象之间的=
比较
public boolean equals(Object obj) {
return (this == obj);
}
由于您创建了两个不同的对象,虽然它们与属性具有相同的值,但它们是两个不同的对象,因此this==obj
返回false
如果您这样做了:
Hole a = new Hole(0,1);
leftFlowInnerHole.add(a);
System.out.print(leftFlowInnerHole.contains(a));
您将看到它输出true
您应该覆盖Hole类的equals方法:
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Hole)) {
return false;
}
Hole other = (Hole) obj;
return a == other.a && b == other.b;
}
这不起作用
我只是添加了这行代码来检查(for-loop)中的条件,然后它就可以正常工作了
在这种情况下不是执行equals()默认实现吗?为什么为false(因为默认实现使用==进行比较)?这是答案中遗漏的一点。
Hole a = new Hole(0,1);
leftFlowInnerHole.add(a);
System.out.print(leftFlowInnerHole.contains(a));
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Hole)) {
return false;
}
Hole other = (Hole) obj;
return a == other.a && b == other.b;
}
if(priceidslist.contains(extraId)){
//Not working
}
String gh = String.valueOf(priceidslist.get(j));
if(gh.equals(extraId)){
rw.put("extraPrice",pricelist.get(j));
}