1

我有一个Array对象,因为我使用的是第 3 方库,所以数组是通过从库中调用一个方法获得的,我无法访问 MyObject 该类

//I have no access to MyObject class, I am sure the objects contain duplicated elements.
MyObject[] objects = SOME_LIB_CLASS.getObjects(); 
System.out.println("length is "+ objects.length); //length is 6

我尝试删除对象中的重复元素,我使用Set

Set<MyObject>  objectSet = new HashSet<MyObject>(Arrays.asList(objects));
System.out.println("length is "+ objectSet.size()); //length is 6 still

但是objectSet仍然包含重复的元素,为什么以及如何在不遍历数组的情况下解决我的问题?

4

4 回答 4

3

如果集合仍然包含“重复”元素,则对象的 equals 方法不会像您期望的那样。

a 中的重复项HashSetequals实现确定。

如果您无法更改的实现MyObject.equals()(因为您没有源代码 - 它是一个库类),我建议使用 aTreeSet并提供一个特殊的比较器。

例如

public class Main {

    public static class MyObject {

        public int value;

        @Override
        public String toString() {
            return "MyObject [value=" + value + "]";
        }

    }

    public static void main(String str[]) throws IOException {
        Set<MyObject> myObjects = new TreeSet<MyObject>(
                new Comparator<MyObject>() {

                    public int compare(MyObject object1, MyObject object2) {
                        return object1.value - object2.value;
                    }
                });

        addMyObjects(myObjects);
        addMyObjects(myObjects); // try to add the duplicates

        System.out.println(myObjects);
    }

    private static void addMyObjects(Set<MyObject> set){
        for (int i = 0; i < 5; i++) {
            MyObject myObject = new MyObject();
            myObject.value = i;
            set.add(myObject);
        }
    }
}
于 2013-10-15T12:55:20.600 回答
0

它包含重复的条目,因为MyObject不会覆盖equalshashcode. 如果您无法访问该类,那么您必须遍历数组,并手动检查差异。

于 2013-10-15T12:53:51.260 回答
0

您可以尝试打印对象的哈希码吗,我认为这些对象不一样,但它们的字段具有相同的值。如果 MyObject 是您的类,请覆盖 equals 和 hascode 方法以使 set 工作。

于 2013-10-15T12:54:32.893 回答
0

希望下面的代码对你有帮助

            ArrayList al = new ArrayList();
            al.add("hello");
            al.add("hi");
            al.add("hello");
            al.add("dadsa");
            al.add("hello");

            // add elements to al, including duplicates
            HashSet hs = new HashSet();
            hs.addAll(al);
            al.clear();
            al.addAll(hs);

            for(int i=0; i<al.size(); i++)
            {
                Log.i("element ", al.get(i).toString());

            }

它将从arraylist中删除所有重复值

于 2013-10-15T13:36:09.463 回答