TreeMap 排序
一、TreeMap
TreeMap 預設排序規則:按照key的字典順序來排序(升序)
當然,也可以自定義排序規則:要實現Comparator介面。
用法簡單,先看下下面的demo
public class SortDemo {
public static void main(String[] args) {
System.out.println("---------------- 預設 排序結果-----------------");
createDefaultSortTreeMap();
System.out.println("---------------- 自定義 排序結果-----------------");
createDefinitionSortTreeMap();
}
public static void createDefaultSortTreeMap() {
TreeMap<String, String> map = new TreeMap<String, String>();
init(map);
print(map);
}
public static void createDefinitionSortTreeMap() {
TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
init(map);
print(map);
}
public static void init(Map<String, String> map) {
map.put("c", "1");
map.put("a", "1");
map.put("bb", "1");
map.put("b", "1");
}
public static void print(Map<String, String> map) {
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<String, String> entry = it.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
結果:
---------------- 預設 排序結果-----------------
a : 1
b : 1
bb : 1
c : 1
---------------- 自定義 排序結果-----------------
c : 1
bb : 1
b : 1
a : 1
二、擴充套件:字典順序
1、排序規則
兩個字串 s1, s2比較
(1)、如果s1和s2是父子串關係,則 子串 < 父串
(2)、如果非為父子串關係, 則從第一個非相同字元來比較。
例子 s1 = "ab", s2 = "ac" 這種情況演算法規則是從第二個字元開始比較,由於'b' < 'c' 所以 "ab" < "ac"
(3)、字元間的比較,是按照字元的位元組碼(ascii)來比較
2、 compareTo 實現機制:對於字串來說,字典排序規則;對於數字來說,直接按照大小排序
下面, 是我在專案中,遇到的一個坑,也不能算坑吧,只能說基礎掌握得不紮實,導致老不斷犯錯。先說下場景,有個需求要對Map排序,當時想當然就用了自定義的TreeMap(new Comparator )
key 為 String, value 也會String型別, 然後很不幸的是,我的Key 是 數字 字串 ,如 Map.put("2","1"),Map.put("12","1"),Map.put("13","1")
正常思維排序結果是 "2" < "12" < "13" ,仔細一想,compareTo 底層演算法是 "字典排序",正確的排序結果 : "12" < "13" < "2"
但是我的需求又是想要"2" < "12" < "13"這種效果,如何實現呢?很簡單,把Key改為Long型別,這樣,就會按照大小來排序。
看下下面的例子,可能比較簡單明瞭!
public class SortDemo2 {
private final static int SIZE = 30;
public static void main(String[] args) {
System.out.println("---------------- key 為 Sting 排序結果-----------------");
String s = new String();
createTreeMap(s);
System.out.println("---------------- key 為 Long 排序結果-----------------");
Long l = new Long(0);
createTreeMap(l);
}
public static void createTreeMap(Object obj) {
TreeMap<Object, Object> map = new TreeMap<>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof String && o2 instanceof String) {
return ((String) o1).compareTo((String) o2);
} else if(o1 instanceof Long && o2 instanceof Long) {
return ((Long) o1).compareTo((Long) o2);
}
return 0;
}
});
for(int i = 1; i<SIZE; i++) {
if(obj instanceof String) {
map.put(String.valueOf(i), String.valueOf(i));
}
if(obj instanceof Long) {
map.put(Long.valueOf(i), Long.valueOf(i));
}
}
print(map);
}
public static void print(Map<Object, Object> map) {
Iterator<Entry<Object, Object>> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry<Object, Object> entry = it.next();
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
結果:
---------------- key 為 Sting 排序結果-----------------
1 : 1
10 : 10
11 : 11
12 : 12
13 : 13
14 : 14
15 : 15
16 : 16
17 : 17
18 : 18
19 : 19
2 : 2
20 : 20
21 : 21
22 : 22
23 : 23
24 : 24
25 : 25
26 : 26
27 : 27
28 : 28
29 : 29
3 : 3
4 : 4
5 : 5
6 : 6
7 : 7
8 : 8
9 : 9
---------------- key 為 Long 排序結果-----------------
1 : 1
2 : 2
3 : 3
4 : 4
5 : 5
6 : 6
7 : 7
8 : 8
9 : 9
10 : 10
11 : 11
12 : 12
13 : 13
14 : 14
15 : 15
16 : 16
17 : 17
18 : 18
19 : 19
20 : 20
21 : 21
22 : 22
23 : 23
24 : 24
25 : 25
26 : 26
27 : 27
28 : 28
29 : 29