TreeMapの運用

4191 ワード

最近、1つのモデルの異なる列でソートする必要があるという問題に遭遇しました.JDK APIドキュメントを調べてみると、javaでソートできるツールクラスとインタフェースには5つのSortedMap、SortedSet、TreeMap、TreeSet、Collectionsがあります.私がソートするのは一連のモデルなので、最後にTreeMapオブジェクトを使用し、TreeMapから最後の処理は自由です.TreeMapオブジェクトを直接返すか、モデルのCollectionオブジェクトを返すことができます.他のいくつかのクラスの使い方は実は大同小異で、javaの基礎が比較的に良いならば、APIドキュメントを見てみると分かりやすいが、Collectionではsort()メソッドを明示的に呼び出す必要があるだけだ.
      
       理論を書くものや深く入り込むものが多すぎて、面倒に見えるので、ここでは実用的なことを求めて、あまり言わないで、直接正体に入って、基本的なソートコードは以下の通りです.
      
      /***************************
       * クラス名:TestSort.java
       * 作者:あ       ***************************/
package ChineseSort;

import java.util.Collection;

import java.util.Iterator;

import java.util.SortedMap;

import java.util.TreeMap;

 

/**

 * @author  

 *

 */

public class TestSort {

 /**

 * @param args

 */

public static void main(String[] args) {

    // TODO Auto-generated method stub    

    TreeMap map = new TreeMap();      

        for(int i=0; i<10; i++) {

        String  s = ""+(int)(Math.random()*1000);

        map.put(s,s);

    }

    map.put("abcd","abcd");

    map.put("Abc", "Abc");

    map.put("bbb","bbb");

    map.put("BBBB", "BBBB");

    map.put("  ","  ");

    map.put("  ","  ");

    map.put("  ", "  ");

    map.put("  ", "  ");

    map.put("  ", "  ");

    map.put("  ", "  ");

    Collection col = map.values();

    Iterator it = col.iterator();

    while(it.hasNext()) {

        System.out.println(it.next());

    }

}

}

        コードはあまり説明されていませんが、見るとわかります.10個の整数乱数を入れ始め、英語、それから中国語です.実行結果は次のとおりです.
132
205
287
295
399
410
411
464
670
73
Abc
BBBB
abcd
bbb
上海
中国
北京
アモイ
碑海
香港
       注意、ここの数字のソートは正常で、英語のソートは大文字と小文字を区別しています.これも正常です.ASCIIコードの小文字は大文字より後ろにあるので、中国語のソートは明らかに正しくありません.碑と北は明らかに一緒にいなければなりません.そして、一番前にあるはずです.これは主にjavaで中国語コードGB 2312やJBKを使用している場合、char型をint型に変換する過程に大きなばらつきがあり、多くの文章で紹介されていますが、ネットで探してみてください.ここではあまり言わないで、直接解決策を探しています.
        Javaでバラツキが発生したのは,主にcomparareメソッドの問題であるため,ここでは自らComparatorインタフェースを実現し,国際化の問題はCollatorクラスを用いて解決する.ここでまず中国語の問題を解決します.コードは以下の通りです.
        /**********************************
       * クラス名:CollatorComparator.java
       * 作者:あ       **********************************/
package ChineseSort;

 import java.text.CollationKey;

import java.text.Collator;

import java.util.Comparator;

 

/**

 * @author

 *

 */

public class CollatorComparator implements Comparator {

Collator collator = Collator.getInstance();

 public int compare(Object element1, Object element2) {

    CollationKey key1 = collator.getCollationKey(element1.toString());

    CollationKey key2 = collator.getCollationKey(element2.toString());

    return key1.compareTo(key2);

}

}

  前に完成したTestSortクラスを修正し、
        TreeMap map = new TreeMap();
        次のように変更
    CollatorComparator comparator = new CollatorComparator();
    TreeMap map = new TreeMap(comparator);
     クラスを再実行します.実行結果は次のとおりです.
325
62
653
72
730
757
874
895
909
921
Abc
abcd
bbb
BBBB
碑海
北京
上海
アモイ
香港
中国
        中国語のソートが正常に完了していることがわかります.英語で大文字と小文字を区別しないようにするには、CollatorComparatorクラスを変更し、
     element1.toString()
     次のように変更します.
     element1.toString().toLowerCase()
     もちろん大文字に変換しても構いませんが、もちろんelement 2.toString()もelement 2.toString().toLowerCase()に同時に変更します.再実行の結果は次のとおりです.
 
207
353
656
659
770
789
857
861
931
984
Abc
abcd
bbb
BBBB
碑海
北京
上海
アモイ
香港
中国
     ソートは私たちの要求に完全に合っていることがわかります.逆ソートも簡単で、遍歴するときに逆になるか、2つのComparatorの実装クラスを書くか、順方向のソートは私たちが前に書いたように、逆ソートはreturn key 1.comparator(key 2)になります.return-key 1.compareTo(key 2)に変更します.マイナス記号をつけて、ここで直接記号をつけて効果を見ることができて、結局私は書かないで、中国はNumber Oneに違いありません.私はまだTreeMapの中で直接逆の方法を見つけていません.誰が見たか教えてください.