在我的案例中使用Set删除数组中的重复元素

时间:2013-10-15 12:51:49

标签: java arrays swing java-ee set

我有Array个对象,因为我使用的是第三方库,通过从库中调用一个方法来获取数组,我无法访问 { {1}}

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 仍然包含重复的元素,为什么&amp;如何在不迭代数组的情况下解决我的问题?

4 个答案:

答案 0 :(得分:3)

如果集合仍然包含“重复”元素而不是对象的equals方法,则不会达到预期目的。

HashSet中的重复项由equals实施确定。

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

例如

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);
        }
    }
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分: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中删除所有重复值