キーの逆順でJavaでマップを並べ替える
この投稿では、キーの逆順に従ってJavaでマップをソートするさまざまな方法について説明します。
1.使用する TreeMap
TreeMap
赤黒木ベースの実装です Map
、コンストラクターに提供されたコンパレーターに従ってソートされます。を渡すことによって 逆順コンパレータ に TreeMap
、キーの逆順に従ってマップを並べ替えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; class Main { //キーの逆順でJavaのマップをソートする一般的なメソッド public static <K extends Comparable, V> Map<K, V> sortByKeys(Map<K, V> map) { Map<K, V> treeMap = new TreeMap<>(new Comparator<K>() { @Override public int compare(K a, K b) { return b.compareTo(a); } }); treeMap.putAll(map); return treeMap; } public static void main(String[] args) { Map<String, String> colors = new HashMap<>(); colors.put("RED", "#FF0000"); colors.put("BLUE", "#0000FF"); colors.put("GREEN", "#008000"); colors.put("YELLOW", "#FFFF00"); colors = sortByKeys(colors); System.out.println("Sorted map by keys in Reverse Order:\n" + colors); } } |
出力:
Sorted map by keys in Reverse Order :
{YELLOW=#FFFF00, RED=#FF0000, GREEN=#008000, BLUE=#0000FF}
上記のコードはカスタムコンパレータを使用していますが、Javaが提供する次のような逆順のコンパレータを使用できます。
1 |
Map<K, V> treeMap = new TreeMap<>(Collections.reverseOrder()); |
1 |
Map<K, V> treeMap = new TreeMap<>((a, b) -> b.compareTo(a)); |
⮚ TreeMap.descendingMap()
方法
使用できます TreeMap.descendingMap()
これは、ツリーマップに含まれるマッピングの逆順ビューを返します。
1 2 3 4 5 6 7 |
//マップをキーで逆の順序で並べ替える一般的な方法 public static <K, V> Map<K, V> sortByKeys(Map<K, V> unsortedMap) { //指定されたマップから`TreeMap`を作成し、逆の順序を返します //このマップに含まれるマッピングのビュー return new TreeMap<>(unsortedMap).descendingMap(); } |
⮚Guavaを使用する TreeMap
使用することもできます TreeMap
以下に示すように、Guavaによって提供される実装:
1 2 3 4 5 6 7 8 |
//キーの逆順でJavaのマップをソートする一般的なメソッド public static <K, V> TreeMap<K, V> sortByKeys(Map<K, V> map) { TreeMap<K, V> treeMap = Maps.newTreeMap( (Comparator<K>) Ordering.natural().reverse()); treeMap.putAll(map); return treeMap; } |
2.使用する LinkedHashMap
私たちは、 LinkedHashMap
反復順序は、マップへのキーの挿入順序と同じです。このプロパティを使用して、キーの逆の順序に従って並べ替えられたマップのコピーを作成できます。
マップからキーのリストを作成し、降順で並べ替えるという考え方です。次に、逆にソートされたリストのすべてのキーについて、キーと値のペアを空に挿入します LinkedHashMap
。結果として生じる LinkedHashMap
キーの逆順で並べ替えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import java.util.*; class Main { //キーの逆順でJavaのマップをソートする一般的なメソッド public static <K extends Comparable, V> Map<K, V> sortByKeys(Map<K, V> map) { //マップキーのリストを作成して並べ替えます List<K> keys = new ArrayList<K>(map.keySet()); Collections.sort(keys, Collections.reverseOrder()); //空の`LinkedHashMap`を作成します Map<K, V> linkedHashMap = new LinkedHashMap<>(); //`ListIterator`を使用してリストを反復します ListIterator<K> itr = keys.listIterator(); //ソートされたリストのすべてのキーに対して、キーと値のペアを挿入します //`LinkedHashMap`で while (itr.hasNext()) { K key = itr.next(); linkedHashMap.put(key, map.get(key)); } return linkedHashMap; } public static void main(String[] args) { Map<String, String> colors = new HashMap<>(); colors.put("RED", "#FF0000"); colors.put("BLUE", "#0000FF"); colors.put("GREEN", "#008000"); colors.put("YELLOW", "#FFFF00"); colors = sortByKeys(colors); System.out.println("Sorted map by keys in Reverse Order:\n" + colors); } } |
出力:
Sorted map by keys in Reverse Order :
{YELLOW=#FFFF00, RED=#FF0000, GREEN=#008000, BLUE=#0000FF}
3.Java8の使用
Java 8 Streamを使用して、マップをキーで逆の順序で並べ替えることもできます。手順は次のとおりです。
- マップに含まれるマッピングのセットビューからストリームを取得します。
- を使用して、キーの逆順でストリームを並べ替えます
Stream.sorted()
方法。 - 構築する
LinkedHashMap
を使用してストリームからStream.collect()
とCollectors.toMap()
.
次のプログラムはそれを示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; class Main { public static void main(String[] args) { Map<String, String> colors = new HashMap<>(); colors.put("RED", "#FF0000"); colors.put("BLUE", "#0000FF"); colors.put("GREEN", "#008000"); colors.put("YELLOW", "#FFFF00"); // Java 8以降では、キーの順序を逆にしてマップを並べ替えます colors = colors.entrySet() // Set<Entry<String, String>> .stream() // Stream<Entry<String, String>> .sorted(Collections.reverseOrder(Map.Entry.comparingByKey())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new )); System.out.println("Sorted map by keys :\n" + colors); } } |
出力:
Sorted map by keys in Reverse Order :
{YELLOW=#FFFF00, RED=#FF0000, GREEN=#008000, BLUE=#0000FF}
コレクターの使用を伴わない別のアプローチは、 Stream.forEachOrdered()
ストリームの各要素を新しいものに挿入する、逆にソートされたストリームのメソッド LinkedHashMap
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; class Main { public static void main(String[] args) { Map<String, String> colors = new HashMap<>(); colors.put("RED", "#FF0000"); colors.put("BLUE", "#0000FF"); colors.put("GREEN", "#008000"); colors.put("YELLOW", "#FFFF00"); // Java 8以降では、キーの順序を逆にしてマップを並べ替えます Map<String, String> sortedMap = new LinkedHashMap<>(); colors.entrySet() // Set<Entry<String, String>> .stream() // Stream<Entry<String, String>> .sorted(Collections.reverseOrder(Map.Entry.comparingByKey())) .forEachOrdered(entry -> sortedMap.put(entry.getKey(), entry.getValue())); System.out.println("Sorted map by keys :\n" + sortedMap); } } |
出力:
Sorted map by keys in Reverse Order :
{YELLOW=#FFFF00, RED=#FF0000, GREEN=#008000, BLUE=#0000FF}
これで、JavaでMapをキーの逆順で分別ることができます。
参照: