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

数据如下所示:

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

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


当前回答

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

其他回答

如果你已经有了一个地图,想要按键排序,只需使用:

Map<String, String> treeMap = new TreeMap<String, String>(yourMap);

一个完整的工作示例:

import java.util.HashMap;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;

class SortOnKey {

    public static void main(String[] args) {
       HashMap<String, String> hm = new HashMap<String, String>();
       hm.put("3", "three");
       hm.put("1", "one");
       hm.put("4", "four");
       hm.put("2", "two");
       printMap(hm);
       Map<String, String> treeMap = new TreeMap<String, String>(hm);
       printMap(treeMap);
    } // main

    public static void printMap(Map<String, String> map) {
        Set s = map.entrySet();
        Iterator it = s.iterator();
        while (it.hasNext()) {
           Map.Entry entry = (Map.Entry) it.next();
           String key = (String) entry.getKey();
           String value = (String) entry.getValue();
           System.out.println(key + " => " + value);
        } // while
        System.out.println("========================");
    } // printMap

} // class

我们也可以使用数组对键进行排序。排序方法。

Map<String, String> map = new HashMap<String, String>();
Object[] objArr = new Object[map.size()];

for (int i = 0; i < map.size(); i++) {
    objArr[i] = map.get(i);
}

Arrays.sort(objArr);

for (Object str : objArr) {
    System.out.println(str);
}

在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);
    }
);

在Java 8中

将Map<K, V>按键排序,将键放入List<K>:

List<K> result = map.keySet().stream().sorted().collect(Collectors.toList());

要按键对Map<K, V>排序,将条目放入List<Map。进入< K、V > >:

List<Map.Entry<K, V>> result =
    map.entrySet()
       .stream()
       .sorted(Map.Entry.comparingByKey())
       .collect(Collectors.toList());

最后但并非最不重要的:以语言环境敏感的方式对字符串排序-使用Collator (comparator)类:

Collator collator = Collator.getInstance(Locale.US);
collator.setStrength(Collator.PRIMARY); // case insensitive collator

List<Map.Entry<String, String>> result =
    map.entrySet()
       .stream()
       .sorted(Map.Entry.comparingByKey(collator))
       .collect(Collectors.toList());

使用下面的树形图:

Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
    .thenComparing(Function.identity()));

无论您在sortedMap中放入什么,它都会自动排序。首先,TreeMap是Map接口的排序实现。

有一个“但是”,因为它按自然顺序排列钥匙。正如Java文档所述,String类型是一种字典自然顺序类型。想象一下下面String类型的数字列表。这意味着下面的列表将不会按预期排序。

<String> 工作表 notsortedList = List.of(“78”,“0”, “24”, “39”, “4”,“53”,“32”);

如果你只使用默认的TreeMap构造函数,如下图所示,并逐个推入每个元素:

Map<String, String> map = new TreeMap<>();
for (String s : notSortedList) {
    map.put(s, s);
}

System.out.println(map);

输出为:{0= 0,14 = 14,24 = 24,32 = 32,39 = 39,4 = 4,48 = 48,53 = 53,54 = 54,78 =78}

如你所见,数字4就在“39”后面。这是字典数据类型(如String)的本质。如果这是一个整数数据类型,那么这是可以的。

要解决这个问题,请使用参数首先检查字符串的长度,然后比较它们。在Java 8中是这样做的:

Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
    .thenComparing(Function.identity()));

它首先比较每个元素的长度,然后应用check by compareTo作为与要比较的元素相同的输入。

如果你更喜欢使用一个更容易理解的方法,上面的代码将与下面的代码等效:

> sortedMap = new TreeMap<>( 新的比较器(){ @Override (String o1, String o2) { int lengthDifference = o1.length() - o2.length(); if (lengthDifference != 0) 返回lengthDifference; 返回o1.compareTo (o2); } } );

因为TreeMap构造函数接受比较器接口,所以您可以构建任何更复杂的Composite类实现。

这也是简单版本的另一种形式。

Map<String,String> sortedMap = new TreeMap<>(
   (Comparator<String>) (o1, o2) ->
    {
        int lengthDifference = o1.length() - o2.length();
        if (lengthDifference != 0)
            return lengthDifference;
        return o1.compareTo(o2);
    }
);