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() { TreeMapmap = new TreeMap (); init(map); print(map); } public static void createDefinitionSortTreeMap() { TreeMap map = new TreeMap (new Comparator () { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); init(map); print(map); } public static void init(Map map) { map.put("c", "1"); map.put("a", "1"); map.put("bb", "1"); map.put("b", "1"); } public static void print(Map map) { Iterator > it = map.entrySet().iterator(); while(it.hasNext()) { Entry 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类型,这样,就会按照大小来排序。
看下下面的例子,可能比较简单明了!
1 public class SortDemo2 { 2 3 private final static int SIZE = 30; 4 5 public static void main(String[] args) { 6 System.out.println("---------------- key 为 Sting 排序结果-----------------"); 7 String s = new String(); 8 createTreeMap(s); 9 System.out.println("---------------- key 为 Long 排序结果-----------------"); 10 Long l = new Long(0); 11 createTreeMap(l); 12 } 13 14 public static void createTreeMap(Object obj) { 15 16 TreeMap