我想实现以下目标,我有一个列表形式的日期集合,我想对其进行重复数据删除和排序。我正在使用 collections.sort 按日期升序对列表进行排序,然后使用 treeSet 从列表中复制和删除元素。这是2次射击的方法?有更快的一步法吗?
EDIT::
Metadata
{
String name;
Date sourceDate;
}
基本上我想根据 sourceDate 订购 Metadata 对象并对其进行重复数据删除。
我想实现以下目标,我有一个列表形式的日期集合,我想对其进行重复数据删除和排序。我正在使用 collections.sort 按日期升序对列表进行排序,然后使用 treeSet 从列表中复制和删除元素。这是2次射击的方法?有更快的一步法吗?
EDIT::
Metadata
{
String name;
Date sourceDate;
}
基本上我想根据 sourceDate 订购 Metadata 对象并对其进行重复数据删除。
您可以跳过这Collections#sort
一步:TreeSet
将删除重复项并对条目进行排序。所以基本上它是一个单行操作:
Set<Date> sortedWithoutDupes = new TreeSet<Date> (yourList);
如果日期是对象中的一个字段,您可以:
Comparator<YourObject>
作为参数传递给 TreeSet 构造函数,该构造函数按日期对对象进行排序在这两种情况下,您都不需要对列表进行预先排序。
重要的提示:
TreeSet 用于compareTo
比较键。因此,如果 2 个键具有相同的日期但不同的名称,则应确保您的 compare 或 compareTo 方法返回非 0 值,否则 2 个对象将被视为相等,并且只会插入一个。
编辑
代码可能如下所示(未经测试+您应该处理空值):
Comparator<Metadata> comparator = new Comparator<Metadata>() {
@Override
public int compare(Metadata o1, Metadata o2) {
if (o1.sourceDate.equals(o2.sourceDate)) {
return o1.name.compareTo(o2.name);
} else {
return o1.sourceDate.compareTo(o2.sourceDate);
}
}
};
Set<Metadata> sortedWithoutDupes = new TreeSet<Metadata> (comparator);
sortedWithoutDupes.addAll(yourList);
TreeSet 将自动对其元素进行排序,因此您不需要在添加到集合之前对列表进行排序。