1

我想实现以下目标,我有一个列表形式的日期集合,我想对其进行重复数据删除和排序。我正在使用 collections.sort 按日期升序对列表进行排序,然后使用 treeSet 从列表中复制和删除元素。这是2次射击的方法?有更快的一步法吗?

EDIT:: 

Metadata
{
 String name;
 Date sourceDate;
}

基本上我想根据 sourceDate 订购 Metadata 对象并对其进行重复数据删除。

4

2 回答 2

4

您可以跳过这Collections#sort一步:TreeSet将删除重复项并对条目进行排序。所以基本上它是一个单行操作:

Set<Date> sortedWithoutDupes = new TreeSet<Date> (yourList);

如果日期是对象中的一个字段,您可以:

  • 让您的对象实现 Comparable 并根据对象的日期比较对象
  • 或将 aComparator<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);
于 2013-01-23T23:38:42.440 回答
0

TreeSet 将自动对其元素进行排序,因此您不需要在添加到集合之前对列表进行排序。

于 2013-01-23T23:38:54.070 回答