【问题标题】:SortedSet or sorted CollectionSortedSet 或 sorted Collection
【发布时间】:2012-05-14 13:46:46
【问题描述】:

假设一个应用程序产生许多HashMap<String, MyClass> 数据结构,每个数据结构包含几十到几百个Comparable 类型为MyClass 的对象,这些对象最终需要在一个单独且排序的Collection 中结束。

此功能的两种可能实现返回一个 SortedSet 或一个排序列表,如下所示:

public static Set<MyClass> getSortedSet(HashMap<String, MyClass>... allMaps)
{
    SortedSet<MyClass> set = new TreeSet<MyClass>();

    Collection<MyClass> c;

    for (HashMap<String, MyClass> map:allMaps)
    {
        c = map.values();
        set.addAll(c);
    }

    return set;
}

public static List<MyClass> getSortedList(HashMap<String, MyClass>... allMaps)
{
    List<MyClass> list = new ArrayList<MyClass>();

    Collection<MyClass> c;

    for (HashMap<String, MyClass> map:allMaps)
    {
        c = map.values();
        list.addAll(c);
    }

    Collections.sort(list);

    return list;
}

上述两种方法是否有明显的性能优势?

是否有更快的方法来实现相同的功能?

【问题讨论】:

  • 如果您想知道哪个更快,为什么不根据您的实际数据来衡量它们?
  • 因为其他人将使用该代码!我要问的是,一种实现或另一种实现速度是否有深刻的原因!
  • 您仍然可以随时进行负载测试以了解更好的性能...

标签: java list sorting collections sortedset


【解决方案1】:

排序列表方法的一些问题:

ArrayLists 由数组支持。每当您添加一个新元素时,它可能必须在幕后增加数组。如果你想使用这种方法,你应该事先创建适当大小的 ArrayList。

添加所有元素后的排序似乎不是最佳的。为什么不将元素添加到列表中的正确位置? (使用排序集合然后变成列表)A good Sorted List for Java

要真正回答您的问题,我将采用在幕后使用 TreeSet 的方法。因为,如果用户想要,他们总是可以做 Set.toArray() ,然后有一个列表。

【讨论】:

【解决方案2】:

从某种意义上说,集合和列表的性质不同,集合不保留重复项。您只能拥有一个对象的一个​​实例。列表允许您保留重复项。

因此,集合做更多的工作,因此它们更慢。

【讨论】:

  • 当然,但假设没有重复。是否有任何理由假设一种实现总是比另一种更快?
  • 也许这与是否存在重复无关,而是关于检查集合中是否存在元素的说明。所以答案仍然适用。
  • @PNS 请参阅下面的 Colin D 答案。使用 TreeSet 并让用户在需要时派生一个数组是一个不错的方法。
  • 他的答案放在上面,但是明白了。谢谢!
【解决方案3】:

是否有任何理由假设一种实现总是比另一种更快?

不,没有理由假设。

哪个更快可能取决于数据量、属性、比较器的性能特征、JDK、JIT 编译器等。

确定的唯一方法是根据实际数据对代码进行基准测试。

【讨论】:

  • 有人指向stackoverflow.com/questions/6971152/…,但随后删除了评论。不过,TreeSet 似乎确实更快。
  • @PNS:这是一个不同的问题(他们在每次插入后对列表进行排序,而您只在最后进行排序)。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2013-07-21
  • 2020-01-30
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多