为什么ts.contains(t)
返回false
,我该如何解决?
看一下我的代码,请:
class MyList {
private String x;
public MyList (String x) {
this .x = x;
}
public String toString () {
return x;
}
public static void main ( String [] args ) {
List<MyList> ts = new ArrayList<MyList>();
ts.add (new MyList ("one"));
ts.add (new MyList ("two"));
ts.add (new MyList ("three"));
MyList t = new MyList("one");
System.out.println ("Is t in ts? " + ts.contains(t));
}
}
谢谢大家的帮助。 SamzSakerz和michaeak答案都可以正常工作。
答案 0 :(得分:5)
只需实现equals()
方法:
class MyList {
private String x;
public MyList (String x) {
this .x = x;
}
@Override
public String toString () {
return x;
}
public static void main ( String [] args ) {
List<MyList> ts = new ArrayList<MyList>();
ts.add (new MyList ("one"));
ts.add (new MyList ("two"));
ts.add (new MyList ("three"));
MyList t = new MyList("one");
System.out.println ("Is t in ts? " + ts.contains(t));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((x == null) ? 0 : x.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MyList other = (MyList) obj;
if (x == null) {
if (other.x != null) {
return false;
}
} else if (!x.equals(other.x)) {
return false;
}
return true;
}
}
输出Is t in ts? true
为类equals()
定义了Object
方法,该类是每个类的顶级类。 contains()
方法以合同方式检查所请求的对象a是否包含在列表中(即,同一对象包含在列表中)或相等的对象b(即aequals(b)为true)包含在列表中
对于List.contains(obj)
,不需要执行hashCode
方法,但是,建议您在实现hashCode()
并确保依赖于{两种方法都具有相同的属性。
答案 1 :(得分:3)
您必须重写equals
和hashCode
方法。
contains
依赖于equals
,并且equals的默认实现是比较其身份。然后,如果equals是完全相同的对象,则equals仅返回true。
为了实现equals方法,必须确定何时两个对象相等。在您的情况下,我假设如果对象的唯一字段s
与另一个字段相等,那么您希望将它们视为相等。
更多:
答案 2 :(得分:2)
您可以使用
检查列表中是否包含具有特定属性的对象equals()
答案 3 :(得分:1)
就像其他人指出的那样,您需要覆盖equals
和hashcode
,我们可以在一行中做到这一点。
@Override
public int hashCode() {
return toString().hashCode();
}
@Override
public boolean equals(Object obj) {
return this == obj || obj != null && getClass() == obj.getClass() && toString().equals(obj.toString());
}
现在我们得到的输出是
Is t in ts? true
这是完整的代码:
import java.util.ArrayList;
import java.util.List;
class MyList {
private String x;
public MyList(String x) {
this.x = x;
}
public static void main(String[] args) {
List<MyList> ts = new ArrayList<MyList>();
ts.add(new MyList("one"));
ts.add(new MyList("two"));
ts.add(new MyList("three"));
MyList t = new MyList("one");
System.out.println("Is t in ts? " + ts.contains(t));
}
@Override
public String toString() {
return x;
}
@Override
public int hashCode() {
return toString().hashCode();
}
@Override
public boolean equals(Object obj) {
return this == obj || obj != null && getClass() == obj.getClass() && toString().equals(obj.toString());
}
}