TreeMap<K,V>
的Key值是要求实现java.lang.Comparable
,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。
HashMap<K,V>
的Key值实现散列hashCode()
,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
如果你需要得到一个有序的结果时就应该使用TreeMap,TreeMap是非线程安全的。
TreeMap中默认是按照升序进行排序的,通过自定义的比较器来实现降序。
定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:
-
如果参数字符串等于此字符串,则返回 0 值;
-
如果此字符串小于字符串参数,则返回一个小于 0 的值;
-
如果此字符串大于字符串参数,则返回一个大于 0 的值。
自定义时取反即可,智慧通过自定义类将其作为参数传递进TreeMap的构造方法中,就可以使用自定义降序了。
代码如下:
public class Test {
public static void main(String[] args) {
//初始化自定义比较器
MyComparator comparator = new MyComparator();
//初始化一个map集合
Map<String,String> map = new TreeMap<String,String>(comparator);
//存入数据
map.put("a", "a");
map.put("b", "b");
map.put("f", "f");
map.put("d", "d");
map.put("c", "c");
map.put("g", "g");
//遍历输出
Iterator iterator = map.keySet().iterator();
while(iterator.hasNext()){
String key = (String)iterator.next();
System.out.println(map.get(key));
}
}
static class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
String param1 = (String)o1;
String param2 = (String)o2;
//return param1.compareTo(param2);
return -param1.compareTo(param2);
}
}
}