如何通过专门的比较方式检查List中是否存在对象?

时间:2014-03-06 08:22:53

标签: java list compare

例如,我有一个列表List<MyClass>

List.contains()将使用Object.equals()进行比较,因此我必须使用正确的语义实现方法MyClass.equals(),但我无法对其进行修改。

是否有一个API可以使用专门的比较方法/类进行检查,除了循环和放大自己检查一下?

列表未排序列表,因此我无法使用Collections.binarySearch()

2 个答案:

答案 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和谓词,并返回另一个只包含与谓词匹配的元素的集合。