JavaでHashMapの値でソートする方法はありますか?
JavaのHashMapは素早い検索を提供します。アイテムは「キー、値」のペアで保存されます。HashMapから値を取得するには、そのエントリに対応するキーを使用します。
HashMapは、辞書やディレクトリを実装するための良い方法です。
キーと値は異なるタイプ(例:文字列、整数)であることができます。
私たちは、HashMapのエントリーをキーと値に基づいて並べ替えることができます。
このチュートリアルでは、HashMapを値に基づいてソートします。
基本的な戦略は、HashMapから値をリストで取得し、リストをソートすることです。ここでは、Valueのデータ型がStringの場合、コンパレータを使用してリストをソートします。コンパレータについて詳しく学ぶには、このチュートリアルを読んでください。
値のリストがソートされた状態で得られたら、この新しいリストに基づいて再びHashMapを構築します。
コードを見てみましょう。 (Kōdo o mite mimashō.)
ハッシュマップの値によるソートのシンプルな例
最初にリスト内の文字列の値を取得します。それから、リストをソートします。
リスト内の文字列の値をソートするために、私たちはコンパレータを使用します。このコンパレータは値のリストをアルファベット順に並べ替えます。
Collections.sort(list, new Comparator<String>() {
public int compare(String str, String str1) {
return (str).compareTo(str1);
}
});
一度リストを整理したら、その整理されたリストに基づいて HashMap を作成します。
以下が完全なコードです。 (I hope this helps!)
package com.scdev.collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
LinkedHashMap<String, String> sortedMap = new LinkedHashMap<>();
ArrayList<String> list = new ArrayList<>();
map.put("2", "B");
map.put("8", "A");
map.put("4", "D");
map.put("7", "F");
map.put("6", "W");
map.put("19", "J");
map.put("1", "Z");
for (Map.Entry<String, String> entry : map.entrySet()) {
list.add(entry.getValue());
}
Collections.sort(list, new Comparator<String>() {
public int compare(String str, String str1) {
return (str).compareTo(str1);
}
});
for (String str : list) {
for (Entry<String, String> entry : map.entrySet()) {
if (entry.getValue().equals(str)) {
sortedMap.put(entry.getKey(), str);
}
}
}
System.out.println(sortedMap);
}
}
出力:
{8=A, 5=B, 3=D, 7=F, 10=J, 2=W, 1=Z}
HashMapのエントリは、Stringの値に従ってソートされます。
値によるHashMapのソートの別の例
もしHashMapの値がInteger型であれば、コードは以下のようになります。 (Moshi HashMap no atai ga Integer-gata de areba, kōdo wa ikkō no yō ni narimasu.)
package com.JournalDev;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
ArrayList<Integer> list = new ArrayList<>();
map.put("A", 5);
map.put("B", 7);
map.put("C", 3);
map.put("D", 1);
map.put("E", 2);
map.put("F", 8);
map.put("G", 4);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
list.add(entry.getValue());
}
Collections.sort(list);
for (int num : list) {
for (Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue().equals(num)) {
sortedMap.put(entry.getKey(), num);
}
}
}
System.out.println(sortedMap);
}
}
出力:
{D=1, E=2, C=3, G=4, A=5, B=7, F=8}
ここでは、HashMapの値は整数値に従ってソートされています。
カスタムの比較器を使用してHashMapを並べ替える。
上記の例を見ると、ValueオブジェクトはComparatorインターフェースを実装していることがわかります。ここで、値がカスタムオブジェクトの場合の例を見てみましょう。
私たちは、値に基づいてハッシュマップをソートするためにカスタムの比較器を作成することもできます。値がカスタムオブジェクトの場合に役立ちます。
それでは、’Name’というクラスを持つ値の例を考えましょう。このクラスには、firstNameとlastNameという2つのパラメータがあります。
クラス名のコードは、次のようになります。
package com.JournalDev;
public class Name {
String firstName;
String lastName;
Name(String a, String b){
firstName=a;
lastName=b;
}
public String getFirstName() {
return firstName;
}
}
カスタムの比較器は以下のようになります。
Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());
私たちは名前をfirstNameに従ってソートしていますが、lastNameも利用できます。マップから値を取得するためにリストを使用する代わりに、直接ソートされたハッシュマップを作成するためにLinkedHashMapを使用します。
完全なコードは以下の通りです。
public static void main(String[] args) {
HashMap<Integer, Name> hmap = new HashMap<Integer, Name>();
Name name1 = new Name("Jayant", "Verma");
Name name2 = new Name("Ajay", "Gupta");
Name name3 = new Name("Mohan", "Sharma");
Name name4 = new Name("Rahul", "Dev");
hmap.put(9, name1);
hmap.put(1, name2);
hmap.put(6, name3);
hmap.put(55, name4);
Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());
LinkedHashMap<Integer, Name> sortedMap = hmap.entrySet().stream()
.sorted(Map.Entry.<Integer, Name>comparingByValue(byName))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
//printing the sorted hashmap
Set set = sortedMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry me2 = (Map.Entry) iterator.next();
System.out.print(me2.getKey() + ": ");
System.out.println(hmap.get(me2.getKey()).firstName + " "+hmap.get(me2.getKey()).lastName );
}
}
出力 : 出力結果
1: Ajay Gupta
9: Jayant Verma
6: Mohan Sharma
55: Rahul Dev
結論
このチュートリアルでは、HashMapの値に基づいたソート方法について説明しました。文字列の値のソートは整数の値のソートと異なります。文字列の値の場合、ソートするためには比較器が必要です。一方、整数の値はCollection.sort()を使って直接ソートされます。