我正在编写一段代码,它接受大量对象并将它们添加到另一个数组中。问题是,我不想要任何重复的。有没有一种方法可以实现哈希集来解决这个问题?
public static Statistic[] combineStatistics(Statistic[] rptData, Statistic[] dbsData) {
HashSet<Statistic> set = new HashSet<Statistic>();
for (int i=0; i<rptData.length; i++) {
set.add(rptData[i]);
}
/*If there's no data in the database, we don't have anything to add to the new array*/
if (dbsData!=null) {
for (int j=0; j<dbsData.length;j++) {
set.add(dbsData[j]);
}
}
Statistic[] total=set.toArray(new Statistic[0]);
for (int workDummy=0; workDummy<total.length; workDummy++) {
System.out.println(total[workDummy].serialName);
}
return total;
}//end combineStatistics()
YourObject
上正确实现equals(Object obj)
和hashCode()
。
Set<YourObject> set = new HashSet<YourObject>(yourCollection);
或
Set<YourObject> set = new HashSet<YourObject>();
set.add(...);
然后
YourObject[] array = set.toArray(new YourObject[0])
我认为你应该注意:
1-如果原始收藏中有副本,该怎么办?使用添加到数组中的第一个?使用其他?
2-你肯定需要实现equals和hashcode,这样你就可以知道什么是重复对象
3-你打算创建一个固定大小的数组,然后不再添加对象吗?还是你会继续添加东西?
实际上,您可以使用任何类型的Set,但如果您使用LinkedHashSet,那么您将有一个定义的迭代顺序(看起来像一个数组)。HashSet不会提供任何顺序,TreeSet会尝试按升序排列数据。
取决于您所指的重复项。如果你指的是一个相同的对象,那么你可以使用列表,在将其添加到列表之前,只需查看列表中是否包含该对象。
Object obj = new Object();
List<Object> list = new ArrayList<Object>();
if (!list.contains(obj)) {
list.add(obj);
}