ホームページ  >  記事  >  Java  >  Javaでのマップソートの実装

Javaでのマップソートの実装

王林
王林転載
2019-11-29 13:34:072576ブラウズ

Javaでのマップソートの実装

map はキーと値のペアのコレクション インターフェイスであり、その実装クラスには主に HashMap<span style="font-family:Microsoft Yahei, Hiragino Sans GB, Helvetica, Helvetica Neue, 微软雅黑, Tahoma, Arial, sans-serif">、</span>TreeMap<span style="font-family:Microsoft Yahei, Hiragino Sans GB, Helvetica, Helvetica Neue, 微软雅黑, Tahoma, Arial, sans-serif"> が含まれます。 、</span>Hashtable および LinkedHashMap など。 4 つの違いは次のとおりです (簡単に説明します):

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

TreeMap: 保存したレコードをキーに従って並べ替えることができます。デフォルトは昇順です。並べ替えコンパレータを指定することもできます。Iterator を使用して TreeMap を走査すると、取得されたレコードが並べ替えられています。順不同です。 TreeMap では、キー値を null にすることはできません。非同期。

Hashtable: HashMap と似ていますが、キーも値も null にできない点が異なります。スレッド同期をサポートしています。つまり、常に 1 つのスレッドだけが Hashtable に書き込むことができます。これにより、Hashtale の書き込みが遅くなります。

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

オンライン学習コースの共有: java コース

マップの並べ替え

ツリーマップ

TreeMap はデフォルトで昇順になっています。並べ替え方法を変更する必要がある場合は、コンパレータ Comparator を使用する必要があります。

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));
        }
    }
}

実行結果は次のとおりです:

Javaでのマップソートの実装

上記の例は TreeMap のキー値に基づいて並べ替えていますが、場合によっては、並べ替える TreeMap の値に基づいて並べ替えます。値を並べ替えるには、Collections の sort(List list, Comparator super T> 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()); 
          } 
    }
}

実行結果

Javaでのマップソートの実装

HashMap

すべて HashMap 値であり、順序はありません。 , キーのHashCodeに従って実装されます。この順序付けされていない 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()); 
          } 
     }
}

実行結果:

Javaでのマップソートの実装

その他の関連記事とチュートリアルをお勧めします:Java の概要

以上がJavaでのマップソートの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。