我希望能够让LinkedList.contains()为自定义比较器返回true。
假设我有1个LinkedList和2个对象
LinkedList<MyObject> myList = new LinkedList<MyObject>();
MyObject a = new MyObject("HELLO");
MyObject b = new MyObject("HELLO");
技术上,两个对象在比较方面是相同的(MyObject实现Comparable)
(a == b)== true
但是,当我执行以下操作时,myList不会为myList.contains返回true(b)
myList.add(a)
myList.contains(b) // == false
我认为它因为包含将检查对象引用并且看到a和b是2个不同的对象。 我有什么方法可以做到这一点所以我不必扩展LinkedList来比较这些对象吗?
答案 0 :(得分:26)
LinkedList使用equals方法,而不是Comparable.compareTo。您应该在MyObject中override equals (and hashCode)来解决问题。
答案 1 :(得分:3)
contains()
方法使用equals()
来确定对象是否在列表中。我怀疑您的课程MyObject
没有覆盖equals()
方法,这就是myList.contains(b)
返回false
的原因。
答案 2 :(得分:3)
你需要覆盖MyObject类中的.equals(Oject)和.hashCode()方法(List不需要hashCode ......但是当你覆盖equals时,你必须覆盖hashCode)
包含的基本内容是:
for(each item in the list) { if(theCurrentItem.equals(theItemYouAreLookingFor)) { return (true); } } return (false);
查看Object(for equals和hashCode)here
的文档另一本非常好的书是Effective Java
答案 3 :(得分:2)
( a == b ) == true
您的意思是a.equals(b)
和b.equals(a)
返回true
吗?这与检查引用相等性不一样,也不检查a.compareTo(b) == 0
。
LinkedList.contains()
使用equals()
,因此您必须确保该方法为implemented correctly。 equals()
也应与compareTo()
保持一致,但这并非绝对必要。如果您使用的是基于哈希的数据结构(例如HashSet
),则必须确保hashCode()
为implemented correctly。
答案 4 :(得分:2)
contains方法的文档如下:
如果此集合返回true 包含指定的元素。更多 正式地,当且仅当如果,则返回true 此集合包含至少一个 元素e使得(o == null?e == null :o.equals(e))。
因此,您需要覆盖MyObject的equals(Object o)方法。
所以对你的例子来说:
public class MyObject {
String myVal;
public boolean equals(Object o ) {
return ((MyObject)o).myVal.equals(myVal);
}
}
您无需使用Comparable接口实现任何功能。
答案 5 :(得分:1)
您是否考虑过使用新的HashSet(Comparator),而不是使用LinkedList搜索每个元素。这将有效地比较元素以找到匹配。