我有一个地图,有字符串的键和值。

数据如下所示:

“问题1”,“1” “question9”、“1” “问题2”、“4” “问题5”、“2”

我想根据键对映射进行排序。所以,最后,我将得到问题1,问题2,问题3,等等。

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

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

现在我有以下内容:

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

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


当前回答

List<String> list = new ArrayList<String>();
Map<String, String> map = new HashMap<String, String>();
for (String str : map.keySet()) {
  list.add(str);
}

Collections.sort(list);

for (String str : list) {
  System.out.println(str);
}

其他回答

简短的回答

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

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

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

这将以键的自然顺序遍历整个地图。


再回答

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

如果你的键是一个复杂类型,没有实现Comparable,或者你不想使用自然顺序,那么TreeMap和TreeSet有额外的构造函数,让你传递一个比较器:

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

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

在HashMap中,从1000个条目移动到10,000个条目并不会真正影响查找元素的时间,但对于TreeMap,查找时间将慢1.3倍(假设Log2)。从1000到100,000的每一个元素查找速度都要慢1.6倍。

这里提供了一个很好的解决方案。我们有一个HashMap,它以未指定的顺序存储值。我们定义了一个辅助TreeMap,并使用putAll方法将所有数据从HashMap复制到TreeMap中。TreeMap中的结果条目按键顺序排列。

使用树地图!

在Java 8中,你也可以使用.stream().sorted():

myMap.keySet().stream().sorted().forEach(key -> {
        String value = myMap.get(key);

        System.out.println("key: " + key);
        System.out.println("value: " + value);
    }
);

假设TreeMap不适合你(假设你不能使用泛型):

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