キーや値でマップをソートするJavaの例はほとんどありません。
1.キーで並べ替え
1.1 java.util.TreeMapを使用すると、自動的にキーでキーをソートします。
SortByKeyExample1.java
package com.mkyong.test; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class SortByKeyExample1 { public static void main(String[]args) { Map<String, String> unsortMap = new HashMap<String, String>(); unsortMap.put("Z", "z"); unsortMap.put("B", "b"); unsortMap.put("A", "a"); unsortMap.put("C", "c"); unsortMap.put("D", "d"); unsortMap.put("E", "e"); unsortMap.put("Y", "y"); unsortMap.put("N", "n"); unsortMap.put("J", "j"); unsortMap.put("M", "m"); unsortMap.put("F", "f"); System.out.println("Unsort Map......"); printMap(unsortMap); System.out.println("\nSorted Map......By Key"); Map<String, String> treeMap = new TreeMap<String, String>(unsortMap); printMap(treeMap); } //pretty print a map public static <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } } }
出力
Unsort Map...... Key : A Value : a Key : B Value : b Key : C Value : c Key : D Value : d Key : E Value : e Key : F Value : f Key : Y Value : y Key : Z Value : z Key : J Value : j Key : M Value : m Key : N Value : n Sorted Map......By Key Key : A Value : a Key : B Value : b Key : C Value : c Key : D Value : d Key : E Value : e Key : F Value : f Key : J Value : j Key : M Value : m Key : N Value : n Key : Y Value : y Key : Z Value : z
1.2さらに別の
java.util.TreeMap`の例では、キーを降順でソートするためのカスタム
Comparator`を提供しています。
SortByKeyExample2.java
package com.mkyong.test; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class SortByKeyExample2 { public static void main(String[]args) { Map<Integer, String> unsortMap = new HashMap<Integer, String>(); unsortMap.put(10, "z"); unsortMap.put(5, "b"); unsortMap.put(6, "a"); unsortMap.put(20, "c"); unsortMap.put(1, "d"); unsortMap.put(7, "e"); unsortMap.put(8, "y"); unsortMap.put(99, "n"); unsortMap.put(50, "j"); unsortMap.put(2, "m"); unsortMap.put(9, "f"); System.out.println("Unsort Map......"); printMap(unsortMap); System.out.println("\nSorted Map......By Key"); Map<Integer, String> treeMap = new TreeMap<Integer, String>( new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } }); /** For Java 8, try this lambda Map<Integer, String> treeMap = new TreeMap<>( (Comparator<Integer>) (o1, o2) -> o2.compareTo(o1) ); ** / treeMap.putAll(unsortMap); printMap(treeMap); } public static <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } } }
出力
Unsort Map...... Key : 1 Value : d Key : 50 Value : j Key : 2 Value : m Key : 99 Value : n Key : 20 Value : c Key : 5 Value : b Key : 6 Value : a Key : 7 Value : e Key : 8 Value : y Key : 9 Value : f Key : 10 Value : z Sorted Map......By Key Key : 99 Value : n Key : 50 Value : j Key : 20 Value : c Key : 10 Value : z Key : 9 Value : f Key : 8 Value : y Key : 7 Value : e Key : 6 Value : a Key : 5 Value : b Key : 2 Value : m Key : 1 Value : d
2.値で並べ替え
Map`を
List <Map>
に変換し、
List <Map>
をカスタム
Comparator`でソートし、それを新しい挿入順序マップに入れます。
LinkedHashMap
Map ---> List<Map> ---> Collections.sort() --> List<Map> (Sorted) ---> LinkedHashMap
SortByValueExample1.java
package com.mkyong.test; import java.util.** ; public class SortByValueExample1 { public static void main(String[]args) { Map<String, Integer> unsortMap = new HashMap<String, Integer>(); unsortMap.put("z", 10); unsortMap.put("b", 5); unsortMap.put("a", 6); unsortMap.put("c", 20); unsortMap.put("d", 1); unsortMap.put("e", 7); unsortMap.put("y", 8); unsortMap.put("n", 99); unsortMap.put("j", 50); unsortMap.put("m", 2); unsortMap.put("f", 9); System.out.println("Unsort Map......"); printMap(unsortMap); System.out.println("\nSorted Map......By Value"); Map<String, Integer> sortedMap = sortByValue(unsortMap); printMap(sortedMap); } private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap) { //1. Convert Map to List of Map List<Map.Entry<String, Integer>> list = new LinkedList<Map.Entry<String, Integer>>(unsortMap.entrySet()); //2. Sort list with Collections.sort(), provide a custom Comparator // Try switch the o1 o2 position for a different order Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); //3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>(); for (Map.Entry<String, Integer> entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } /** //classic iterator example for (Iterator<Map.Entry<String, Integer>> it = list.iterator(); it.hasNext(); ) { Map.Entry<String, Integer> entry = it.next(); sortedMap.put(entry.getKey(), entry.getValue()); }** / return sortedMap; } public static <K, V> void printMap(Map<K, V> map) { for (Map.Entry<K, V> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue()); } } }
出力
Unsort Map...... Key : a Value : 6 Key : b Value : 5 Key : c Value : 20 Key : d Value : 1 Key : e Value : 7 Key : f Value : 9 Key : y Value : 8 Key : z Value : 10 Key : j Value : 50 Key : m Value : 2 Key : n Value : 99 Sorted Map......By Value Key : d Value : 1 Key : m Value : 2 Key : b Value : 5 Key : a Value : 6 Key : e Value : 7 Key : y Value : 8 Key : f Value : 9 Key : z Value : 10 Key : c Value : 20 Key : j Value : 50 Key : n Value : 99
2.2ジェネリックをサポートするために上記の `sortByValue()`メソッドをアップグレードしてください。
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> unsortMap) { List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(unsortMap.entrySet()); Collections.sort(list, new Comparator<Map.Entry<K, V>>() { public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { return (o1.getValue()).compareTo(o2.getValue()); } }); Map<K, V> result = new LinkedHashMap<K, V>(); for (Map.Entry<K, V> entry : list) { result.put(entry.getKey(), entry.getValue()); } return result; }
更新履歴
-
2010年7月7日 – 最初のドラフト.
-
2014年7月8日 – サンプルを追加して入力ミスを修正しました.
-
2016年8月12日 – 汎用メソッドを追加し、コードを再フォーマットし、タイプミスを修正し、
いくつかのコンテンツを書き換えます。
参考文献
JavaDoc]。
http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html
[リンクされたハッシュマップ
JavaDoc]。
http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
[Comparator
JavaDoc]。リンク://java8/java-8-how-to-sort-a-map/[Java 8 – マップのソート方法]
ワイルドカードで楽しい]。
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29
[Collections.sort()
署名]。
http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java
[Difference
スーパーT>とT> Javaの間で拡張]