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