set是一种集合,可以快速查找现有元素。如果要查看一个元素,需要查找元素的精确副本->映射表(map),它存放键/值对。
java类库提供了HashMap和TreeMap.
treemap的构造函数里面有比较器,而hashmap没有。
HashMap本身没有顺序,要么用它实现comparable接口,这里不介绍hashmap的排序
下面讲treemap的排序,两种情况
(1)按照key排序
a)制定排序的比较器
package map;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class MapTest {
public static void main(String[] args){
Map<String,String> tm = new TreeMap(new Comparator<String>(){
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
tm.put("c", "java");
tm.put("d", "c++");
tm.put("a", "maven");
Set<String> ss = tm.keySet();
Iterator it = ss.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
上面这种方法,自己不必实现比较器,它也是有序的,默认是从小到大。制定比较器后,顺序是从大到小,按key排序
(2)按照value排序
Map<String,String> tm1 = new TreeMap(new Comparator<Map.Entry<String, String>>(){
@Override
public int compare(Map.Entry<String, String> o1,
Map.Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map$Entry这个是错误的,我也不知道为什么,我觉得是treemap不能实现这么复杂的比较器
这种方法既然行不通,那么我们可以把map转换成list,然后用collection的sort方法实现比较器
Map<String,String> tm1 = new TreeMap();
tm1.put("c", "java");
tm1.put("d", "c++");
tm1.put("a", "maven");
List<Map.Entry<String, String>> maplist = new ArrayList<Map.Entry<String, String>>(tm1.entrySet());
Collections.sort(maplist, new Comparator<Map.Entry<String, String>>(){
@Override
public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}});
for(Map.Entry<String, String> list : maplist){
System.out.println(list.getKey()+" "+list.getValue());
}
输出
d c++
c java
a maven
由于时间太短,许多值得深思的地方没有深入考虑