繁体   English   中英

排序和重复数据删除java集合

[英]Sort and dedupe java collections

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

EDIT:: 

Metadata
{
 String name;
 Date sourceDate;
}

基本上我想基于sourceDate订购元数据对象并重复它。

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

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

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

  • 让你的对象实现Comparable并根据日期比较对象
  • 或者将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将自动对其元素进行排序,因此您不需要在添加到集合之前对列表进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM