例如,我有一个列表List<MyClass>
。
List.contains()
将使用Object.equals()
进行比较,因此我必须使用正确的语义实现方法MyClass.equals()
,但我无法对其进行修改。
是否有一个API可以使用专门的比较方法/类进行检查,除了循环和放大自己检查一下?
列表未排序列表,因此我无法使用Collections.binarySearch()
。
答案 0 :(得分:1)
您可以在实例化期间为contains()
的单个实例指定自定义List
方法,如下所示:
List<String> list = new ArrayList<String>() {
@Override
public boolean contains(Object o) {
// your own implementation
}
};
答案 1 :(得分:0)
包含()的方法的合同是:
<强> java.util.Collection中强>
如果此collection包含指定的元素,则返回true。更多 正式地,当且仅当此集合包含at时返回true 至少有一个元素e(o == null?e == null:o.equals(e))。
因此我认为超越方法违反合同并不是一个好主意。由于 List 没有排序,找到匹配的元素是 O(n),其中 n 是元素的数量包含在列表。
中在上面的答案中按照 songyuanyao 的建议迭代每个元素不应该伤害并且是直接的。
另一个解决方案是使用com.google.common.collect.Collections2.filter(),它接受Collection和谓词,并返回另一个只包含与谓词匹配的元素的集合。