在我的情况下使用 Set 删除数组中的重复元素
Posted
技术标签:
【中文标题】在我的情况下使用 Set 删除数组中的重复元素【英文标题】:Remove duplicated elements in array by using Set in my case 【发布时间】: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
仍然包含重复的元素,为什么以及如何在不遍历数组的情况下解决我的问题?
【问题讨论】:
另一种选择:为您收到的对象类型创建一个包装类,并在那里实现Equals
和Hashcode
方法。
【参考方案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
不会覆盖equals
和hashcode
。如果您无法访问该类,则必须遍历数组,并手动检查差异。
【讨论】:
【参考方案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中删除所有重复值
【讨论】:
以上是关于在我的情况下使用 Set 删除数组中的重复元素的主要内容,如果未能解决你的问题,请参考以下文章