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}
Values Are Of Type String

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}
Values Are Of Type Integer

ここでは、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
Custom Comparator

結論

このチュートリアルでは、HashMapの値に基づいたソート方法について説明しました。文字列の値のソートは整数の値のソートと異なります。文字列の値の場合、ソートするためには比較器が必要です。一方、整数の値はCollection.sort()を使って直接ソートされます。

コメントを残す 0

Your email address will not be published. Required fields are marked *