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

2022-09-01 09:31:30

我有这个,我需要根据其中包含的值而不是键)以升序打印出来。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");

换句话说,上面的示例应打印如下:

A1, Aania
X1, Abatha
C1, Acathan
S1, Adreenas

答案 1

您无法仅从 HashMap 类中执行此操作。

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

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

有几个集合库(共享资源集合,Google集合等)具有类似的双向Map实现。


答案 2

您需要列出键,根据相应的值对它们进行排序,然后循环访问排序的键。

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

至于使用什么,这里有一些方便的,通用的比较器创建例程,我经常发现很有用。第一个根据值的自然顺序按值排序,第二个允许您指定任意比较器来对值进行排序: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));
        }
    };
}

推荐