在Java中,将HashMap的键保存到按HashMap值排序的ArrayList中

3
我有一个填充了多个条目的HashMap。我想将HashMap的键保存到ArrayList中,但是根据HashMap相应的值对此ArrayList进行排序。
是否有比对HashMap进行排序,然后使用更好的解决方案?
ArrayList<String> sortedKeys = new ArrayList<String>(myHashmap.keySet());

顺便说一下,我并不局限于使用HashMap,但是值设置了顺序,我不想交换键和值,因为浮点数可能会多次改变。


我不明白为什么你要先对地图进行排序,而不是将其添加到列表中,然后再进行排序? - Bugs Buggy
你是对的:排序列表是更好的选择。 - Christoph H.
2个回答

8
您可以使用流API:
List<String> sortedKeys = myMap.entrySet()
                       .stream()
                       .sorted(Map.Entry.comparingByValue())
                       .map(Map.Entry::getKey)
                       .collect(Collectors.toCollection(ArrayList::new));

1
你更快 ;) - Bilbo Baggins
1
Map.Entry.comparingByValue() 是一个很好的方法,我之前不知道它的存在。+1 - Nikolas Charalambidis
1
如果你想使用自定义比较,那么有一个重载方法可用,它需要一个比较器。 - Bilbo Baggins
1
@BilboBaggins 是的,绝对没错。comparingByValue。谢谢你指出来。 - Ousmane D.
谢谢你的回答。这段代码解决了我的问题,但我更喜欢Sweeper的答案,因为它不涉及使用流,而且似乎更容易理解一些。 - Christoph H.
@ChristophH,非常欢迎您,当然,选择您喜欢的答案吧。这就是有多个有效答案的好处。它允许您选择您认为最易读、高效或符合您寻求的任何标准的答案。 :) - Ousmane D.

6

如果我理解正确,您可以先从键中创建数组列表,然后进行排序:

ArrayList<String> list = new ArrayList<>(myHashMap.keySet());
list.sort(Comparator.comparing(myHashMap::get));

谢谢您的回答。代码非常简单易懂。对于我的用途,我需要反转顺序,但是可以使用 Comparator.comparing(myHashMap::get).reversed() 轻松实现。 - Christoph H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接