如何在 Java 中按键对 Map 值进行排序?

新手上路,请多包涵

我有一个包含键和值的字符串的 Map。

数据如下:

“问题1”,“1”

“问题 9”、“1”

“问题 2”、“4”

“问题5”、“2”

我想根据它的键对地图进行排序。所以,最后,我会有 question1, question2, question3 等等。

最终,我试图从这个地图中得到两个字符串:

  • 第一个字符串:问题(按 1 .. 10 的顺序)
  • 第二个字符串:答案(与问题的顺序相同)

现在我有以下内容:

 Iterator it = paramMap.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry) it.next();
    questionAnswers += pairs.getKey() + ",";
}

这让我得到了一个字符串中的问题,但它们不是按顺序排列的。

原文由 n00bstackie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 479
1 个回答

简答

使用 TreeMap 。这正是它的用途。

如果这张地图传递给你,而你无法确定类型,那么你可以执行以下操作:

 SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) {
   String value = map.get(key);
   // do something
}

这将按键的自然顺序遍历地图。


更长的答案

从技术上讲,您可以使用任何实现 SortedMap 的东西,但除了极少数情况外,这相当于 TreeMap ,就像使用 Map 实现通常相当于 HashMap

对于您的键是未实现 Comparable 的复杂类型或您不想使用自然顺序的情况,则 TreeMapTreeSet 具有额外的构造函数,可让您传入一个 Comparator

 // placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
        ...
    }

SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());

Remember when using a TreeMap or TreeSet that it will have different performance characteristics than HashMap or HashSet .粗略地说,查找或插入元素的操作将从 O(1)O(Log(N))

HashMap 中,从 1000 个项目移动到 10,000 个项目并不会真正影响您查找元素的时间,但对于 TreeMap 查找时间将慢大约 1.3 倍(假设 Log 2 ).对于每个元素查找,从 1000 移动到 100,000 将慢大约 1.6 倍。

原文由 Jherico 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题