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

我有一个对象Array ,因为我使用的是第三方库,通过从库中调用一个方法来获取数组, 我无法访问 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 objectSet = new HashSet(Arrays.asList(objects)); System.out.println("length is "+ objectSet.size()); //length is 6 still 

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

如果集合仍然包含“重复”元素而不是对象的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 myObjects = new TreeSet( new Comparator() { 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 set){ for (int i = 0; i < 5; i++) { MyObject myObject = new MyObject(); myObject.value = i; set.add(myObject); } } } 

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

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

希望下面的代码帮助你

  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 

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