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

2022-08-31 04:34:00

我有一个地图,其中包含键和值的字符串。

数据如下所示:

“问题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() + ",";
}

这让我把问题串起来,但它们不是按顺序排列的。


答案 1

简短的回答

使用树状图。这正是它的用途。

如果将此映射传递给您,而您无法确定类型,则可以执行以下操作:

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

这将按键的自然顺序在整个地图上迭代。


更长的答案

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

对于您的键是未实现Compolar的复杂类型,或者您不想使用自然顺序的情况,并且具有允许您传入的其他构造函数:TreeMapTreeSetComparator

// 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());

使用 或 时,请记住,它将具有与 或 不同的性能特征。粗略地说,查找或插入元素的操作将从 O(1) 变为 O(Log(N))。TreeMapTreeSetHashMapHashSet

在 中,从 1000 个项目移动到 10,000 个项目并不真正影响您查找元素的时间,但对于 a,查找时间将慢约 1.3 倍(假设 Log2)。对于每个元素查找,从 1000 移动到 100,000 的速度大约慢 1.6 倍。HashMapTreeMap


答案 2

假设 TreeMap 对你不好(并且假设你不能使用泛型):

List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.