Javaでマップをソートする方法(マップコレクションの利用)を詳しく解説

高洛峰
リリース: 2017-01-17 11:52:00
オリジナル
1541 人が閲覧しました

今日統計を行うときは、地域を並べ替える必要があります。

1. マップの簡単な紹介

マップの並べ替えを説明する前に、まずマップについて少し理解しましょう。 Map はキーと値のペアのコレクション インターフェイスであり、その実装クラスには主に HashMap、TreeMap、Hashtable、LinkedHashMap などが含まれます。 4 つの違いは次のとおりです (簡単に説明します):

HashMap: 最も一般的に使用されるマップ。キーの HashCode 値に基づいてデータを保存します。その値はキーに基づいて直接取得でき、非常に速いアクセス速度。 HashMap では、1 つのレコードのキー値を Null にすることのみが許可されます (複数のレコードは上書きされます)。複数のレコードの値を Null にすることが許可されます。非同期。

TreeMap: キーに従って保存するレコードを並べ替えることができます。また、イテレーターを使用して TreeMap を走査するときに、取得したレコードを並べ替えることもできます。 TreeMap では、キー値を null にすることはできません。非同期。

ハッシュテーブル: HashMap と似ていますが、キーと値の値を null にすることができない点が異なります。スレッド同期をサポートしています。つまり、一度に 1 つのスレッドのみがハッシュテーブルに書き込むことができ、これにより Hashtale が失敗します。書くのが遅くなるとき。

LinkedHashMap: Iterator を使用して LinkedHashMap を走査する場合、最初に取得されたレコードが最初に挿入されます。走査中は HashMap よりも遅くなります。キーと値は両方とも空で非同期にすることができます。

2. マップの並べ替え

TreeMap

TreeMap の並べ替え方法を変更する必要がある場合は、コンパレータを使用する必要があります。

Comparator は、コレクション オブジェクトまたは配列を並べ替えることができるコンパレータ インターフェイスです。このインターフェイスの public Compare(T o1, To2) メソッドを実装すると、主に最初のパラメータ o1 (未満、等しい) に基づいて並べ替えを行うことができます。 o2 以上の場合は、それぞれ負の整数、0、または正の整数を返します。以下の通り:

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>(
                new Comparator<String>() {
                    public int compare(String obj1, String obj2) {
                        // 降序排序
                        return obj2.compareTo(obj1);
                    }
                });
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");

        Set<String> keySet = map.keySet();
        Iterator<String> iter = keySet.iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            System.out.println(key + ":" + map.get(key));
        }
    }
}
ログイン後にコピー

実行結果は以下の通り:

d:dddddd
c:ccccc
b:bbbbb
a:aaaaa

上記の例は TreeMap のキー値に基づいて並べ替えていますが、場合によっては並べ替える TreeMap の値に基づいて並べ替えます。値を並べ替えるには、Collections の sort(List list, Comparator c) メソッドを使用する必要があります。これは、指定されたコンパレータによって生成された順序に従って、指定されたリストを並べ替えます。ただし、前提条件があります。つまり、提供されたコンパレータに従ってすべての要素を比較できなければなりません。以下の通り:

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>();
        map.put("d", "ddddd");
        map.put("b", "bbbbb");
        map.put("a", "aaaaa");
        map.put("c", "ccccc");

        //这里将map.entrySet()转换成list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //然后通过比较器来实现排序
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){ 
               System.out.println(mapping.getKey()+":"+mapping.getValue()); 
          } 
    }
}
ログイン後にコピー

操作結果

a:aaaaa
b:bbbbb
c:ccccc
d:ddddd

HashMap

順序はありません。鍵。この順序付けされていない HashMap のソートをどのように実装すればよいでしょうか? TreeMap の値のソートを参考にして、HashMap のソートも実装できます。

public class HashMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");

        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //升序排序
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){ 
               System.out.println(mapping.getKey()+":"+mapping.getValue()); 
          } 
     }
}
ログイン後にコピー

実行結果

a:aaaaa
b:bbbbb
c:ccccc
d:ddddd

Java でマップを並べ替える方法 (マップ コレクションの使用) の詳細な説明と関連記事については、以下の記事を参照してください。 PHP中国語ウェブサイトです!

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート