【问题标题】:Remove duplicated elements in array by using Set in my case在我的情况下使用 Set 删除数组中的重复元素
【发布时间】:2013-10-23 06:53:10
【问题描述】:

我有一个 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 仍然包含重复的元素,为什么以及如何在不遍历数组的情况下解决我的问题?

【问题讨论】:

  • 另一种选择:为您收到的对象类型创建一个包装类,并在那里实现EqualsHashcode 方法。

标签: java arrays swing jakarta-ee set


【解决方案1】:

如果集合仍然包含“重复”元素,那么你的对象的 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);
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

                    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中删除所有重复值

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-31
          • 2014-11-10
          • 2014-03-04
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多