如何根据其值以升序打印出HashMap <String,String>的内容?

Car*_*erg 31 java sorting hashmap

我有这个HashMap,我需要根据其中包含的(而不是键)以升序打印出来.

但是我打印出来的顺序似乎是随机的.

升序价值顺序打印出来的最佳方法是什么?

Map<String, String> codes = new HashMap<String, String>();

codes.put("A1", "Aania");
codes.put("X1", "Abatha");
codes.put("C1", "Acathan");
codes.put("S1", "Adreenas");
Run Code Online (Sandbox Code Playgroud)

换句话说,上面的例子应该打印出来:

A1, Aania
X1, Abatha
C1, Acathan
S1, Adreenas
Run Code Online (Sandbox Code Playgroud)

mat*_*t b 39

您无法单独从HashMap类中执行此操作.

我会采用Map<String, String> codes,构建一个反向映射,TreeMap<String, String> reversedMapcodesMap 的值映射到键的位置(这将要求您的原始Map具有从键到值的一对一映射).由于TreeMap提供了按升序键顺序返回条目的迭代器,因此这将为您提供所需顺序中第一个映射的值/键组合(按值排序).

Map<String, String> reversedMap = new TreeMap<String, String>(codes);

//then you just access the reversedMap however you like...
for (Map.Entry entry : reversedMap.entrySet()) {
    System.out.println(entry.getKey() + ", " + entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)

有几个集合库(公共集合,Google集合等)具有类似的双向Map实现.

  • 为什么第二个循环是必要的?只需创建一个临时地图,并从"代码"添加切换键和值? (2认同)

Sea*_*ean 11

您需要创建一个键列表,根据相应的值对它们进行排序,然后迭代排序的键.

Map<String, String> map = getMyMap();
List<String> keys = new ArrayList<String>(map.keySet());
Collections.sort(keys, someComparator);
for (String key: keys) {
    System.out.println(key + ": " + map.get(key));
}
Run Code Online (Sandbox Code Playgroud)

至于使用什么someComparator,这里有一些方便的,通用的比较器创建例程,我经常觉得有用.第一个按值按自然顺序对值进行排序,第二个允许您指定任意比较器来对值进行排序:

public static <K, V extends Comparable<? super V>>
        Comparator<K> mapValueComparator(final Map<K, V> map) {
    return new Comparator<K>() {
        public int compare(K key1, K key2) {
            return map.get(key1).compareTo(map.get(key2));
        }
    };
}

public static <K, V>
        Comparator<K> mapValueComparator(final Map<K, V> map,
                                         final Comparator<V> comparator) {
    return new Comparator<K>() {
        public int compare(K key1, K key2) {
            return comparator.compare(map.get(key1), map.get(key2));
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 6

是时候添加一些lambdas了:

codes.entrySet()
    .stream()
    .sorted(Comparator.comparing(Map.Entry::getValue))
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)


psu*_*sun 5

(Map.Entry条目:)的for循环codes.entrySet()对我不起作用.使用Iterator代替.

Iterator<Map.Entry<String, String>> i = codes.entrySet().iterator(); 
while(i.hasNext()){
    String key = i.next().getKey();
    System.out.println(key+", "+codes.get(key));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

你只需要使用:

 Map<>.toString().replace("]","\n");
Run Code Online (Sandbox Code Playgroud)

并用新行替换每个key = value集的结束方括号.