Java TreeMap对数字,英文字母,汉字等排序例子

1. 对于一些简单的数字,英文字母等排序

TreeMap hm = new TreeMap<String, String>(new Comparator() {
 public int compare(Object o1, Object o2) {
      //如果有空值,直接返回0
      if (o1 == null || o2 == null)
  return 0; 
    
     return String.valueOf(o1).compareTo(String.valueOf(o2));
 }
});

compareTo(String str) :是String 提供的一个方法,如果参数字符串等于此字符串,则返回 0 值;如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值;如果按字典顺序此字符串大于字符串参数,则返回一个大于 0 的值。
int compare(T o1,T o2):随第一个参数小于、等于或大于第二个参数而分别返回负整数、零或正整数。

2.对于处理有中文排序的问题

TreeMap hm = new TreeMap<String, String>(new Comparator() {
  public int compare(Object o1, Object o2) {
       //如果有空值,直接返回0
 if (o1 == null || o2 == null)
      return 0; 
    
      CollationKey ck1 = collator.getCollationKey(String.valueOf(o1));
      CollationKey ck2 = collator.getCollationKey(String.valueOf(o2));
      return ck1.compareTo(ck2);              
  }
});

CollationKey:CollationKey 表示遵守特定 Collator 对象规则的 String。比较两个CollationKey 将返回它们所表示的 String 的相对顺序。使用 CollationKey来比较 String 通常比使用 Collator.compare 更快。因此,当必须多次比较 String 时(例如,对一个 String 列表进行排序),使用 CollationKey 会更高效。

排序综合例子

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    
        CollatorComparator comparator = new CollatorComparator();
        TreeMap map = new TreeMap(comparator);
        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());
        }
    }
}

比较器类: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);
    }
}

运行该类,运行结果如下:

325
62
653
72
730
757
874
895
909
921
Abc
abcd
bbb
BBBB
碑海
北京
上海
厦门
香港
中国

此时可以看到中文的排序已经完成正常。如果想不让英文区分大小写,则修改CollatorComparator类,找到element1.toString()修改为:element1.toString().toLowerCase()