最近工做遇到須要按一個model中不一樣的列進行排序的問題,查了一下JDK API文檔,發現,java中能夠排序的工具類和接口共有五個SortedMap 、SortedSet、TreeMap 、TreeSet和Collections,因爲我要排序的是一系列model,因此,最後使用了TreeMap對象,並且TreeMap到最後的處理比較自由,能夠直接返回TreeMap對象,也能夠返回model的一個Collection對象。其它幾個類的用法其實都是大同小異,若是java基礎較好,看一下API文檔很容易明白,只是Collection中須要顯式調用sort()方法而已
寫理論的東西或者深刻的東西就會太多了,並且讓人會看得比較煩,這裏講求實用,就很少說了,直接入正體,基本的排序代碼以下:
package ChineseSort;
import java.util.Collection;
import java.util.Iterator;
import java.util.SortedMap;
import java.util.TreeMap;
public class TestSort {
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
39
410
411
464
670
73
Abc
BBBB
abcd
bbb
上海
中國
北京
廈門
碑海
香港
注意,這裏的數字排序正常,而英文排序是區分大小寫的,這個也是正常的,由於ASCII碼中小寫字母比大寫字母靠後,中文排序則明顯的不正確,碑和北明顯應該在一塊兒的,並且應該在最前面。這個主要是java中使用中文編碼GB2312或者JBK時,char型轉換成int型得過程出現了比較大的誤差,不少文章介紹過了,你們能夠去網上找一下,這裏很少說了,直接尋找解決方案
Java中之因此出現誤差,主要是compare方法的問題,因此這裏本身實現Comparator接口,而國際化的問題,使用Collator類來解決。這裏先解決中文問題,代碼以下:
package ChineseSort;
import java.text.CollationKey;
import java.text.Collator;
import java.util.Comparator;
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()
固然你改爲轉換成大寫的也無所謂了,固然element2.toString()也要同時修改成element2.toString().toLowerCase()。再次運行結果以下:
207
353
656
659
770
789
857
861
931
984
Abc
abcd
bbb
BBBB
碑海
北京
上海
廈門
香港
中國
如今能夠看到,排序已經徹底符合咱們的要求了。若是要反向排序也很容易,遍歷的時候倒過來,或者你寫兩個Comparator的實現類,正向的排序就像咱們前面所寫的,反向排序就將return key1.compareTo(key2);修改爲return -key1.compareTo(key2);,加了個負號,這裏你能夠直接加個符號看看效果,結果我就不寫了,確定中國是Number One。我還真沒找到TreeMap裏直接反向的方法,誰看到了告訴我。