【问题标题】:Sort a HashMap, define the limit and convert to ArrayList对 HashMap 进行排序,定义限制并转换为 ArrayList
【发布时间】:2018-12-06 22:48:34
【问题描述】:

我有一个这样的 HashMap:

public final Map<String, MyClass> myMap = new HashMap<>();

现在我需要对这个 hashmap 进行排序,定义 limt 并转换为 ArrayList。我做了下面的代码:

List<MyClass> collect = myMap.values().stream().sorted((m1, m2) -> Double.compare(m2.getSomething(), m1.getSomething())).limit(amount).collect(Collectors.toList());

问题是这段代码没有性能和效率。 myMap 很大,因此代码需要花费太多时间才能完成。 知道如何处理场景吗?

欢迎任何帮助。谢谢!

【问题讨论】:

  • 当我运行这段代码需要 2 小时才能完成。如果我删除排序函数,代码需要 23 秒。问题是我需要排序函数
  • amount与地图大小有什么关系?比如,它是那个大小的一半还是 10% 还是只有几件?我的观点是,如果amount 较低,则不需要对地图的其余部分进行排序。

标签: java performance arraylist collections hashmap


【解决方案1】:

如果您的Map 真的如您所说的那么大,那么您可能会从使用并行流而不是顺序流中受益。此外,假设MyClass#getSomething 返回double,您可以使用Comparator#comparingDouble

List<MyClass> collect;

collect = myMap.values()
               .parallelStream()
               .sorted(Comparator.comparingDouble(MyClass::getSomething).reversed())
               .limit(amount)
               .collect(Collectors.toList());

我将声明和初始化分成两行以减少占用空间。

【讨论】:

  • 另一种解决方案是有序地创建地图以避免之后进行排序?
  • 我不确定内置类(例如TreeMap)是否允许您在按值排序时构建Map,您仍然必须获得n th 元素不知何故。
  • 此代码更改尚未达到所需的效果。把hashmap改成简单的数组,会不会更有优势?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多