web-dev-qa-db-ja.com

HashMap <String、String>の内容をその値に基づいて昇順でどのように印刷しますか?

このHashMapがあり、それに含まれるvaluesに従って昇順で印刷する必要があります(キーではありません)。

しかし、印刷するときの順序は一見ランダムです。

昇順の値の順序で印刷する最良の方法は何ですか?

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
31
Carlsberg

HashMapクラスのみからこれを行うことはできません。

Map<String, String> codesを取得し、TreeMap<String, String> reversedMapの逆マップを作成します。ここで、codes Mapの値をキーにマップします(これには、元のマップにone-to -キーから値への1つのマッピング)。 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());
}

同様の双方向マップの実装を持つコレクションライブラリ(commons-collections、Googleコレクションなど)がいくつかあります。

39
matt b

キーのリストを作成し、対応する値に従ってソートし、ソートされたキーを反復処理する必要があります。

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に使用するものについては、便利で汎用的なコンパレータ作成ルーチンをいくつか紹介します。最初のものは、自然な順序に従って値でソートし、2番目のものでは、任意のコンパレータを指定して値をソートできます。

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

ラムダを追加します。

codes.entrySet()
    .stream()
    .sorted(Comparator.comparing(Map.Entry::getValue))
    .forEach(System.out::println);
6
Vladimir

あなただけを使用する必要があります:

 Map<>.toString().replace("]","\n");

各key = valueセットの終了角括弧を新しい行に置き換えます。

5
ole scharling

for(Map.Entryエントリ:codes.entrySet())のforループは機能しませんでした。代わりに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));
}
5
psun

Java 8

map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);
3
bluehallu
  1. TreeMap<String,String>
  2. キーとして値を持つHashMapエントリのそれぞれを追加します。
  3. treeMapを反復処理する

値が一意でない場合、2番目の位置にリストが必要になります。

2
bmargulies

キーセットではなく、エントリセットのリストを使用できます。値に基づいてソートしている場合、それはより自然な選択です。これにより、エントリの並べ替えと印刷で多くの不要なルックアップが回避されます。

Map<String, String> map = ...
List<Map.Entry<String, String>> listOfEntries = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(listOfEntries, new SortByValueComparator());
for(Map.Entry<String, String> entry: listOfEntries)
   System.out.println(entry);

static class SortByValueComparator implements Comparator<Map.Entry<String, String>> {
   public int compareTo(Map.Entry<String, String> e1, Map.Entry<String, String> e2) {
       return e1.getValue().compateTo(e2.getValue());
   }
}
1
Peter Lawrey

私が考える最も簡単で最短のコードはこれです:

public void listPrinter(LinkedHashMap<String, String> caseList) {

    for(Entry entry:caseList.entrySet()) {
        System.out.println("K: \t"+entry.getKey()+", V: \t"+entry.getValue());
    }
}
0
TheTeslaa