キーや値でマップをソートする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の間で拡張]