Map排序(按key排序,按value排序)
对map进行排序,首先了解自定义的Comparator实现。
/**比较算法根据第一个参数o1,
* 小于、等于或者大于o2分别返回负整数、0或者正整数,来决定二者存放的先后位置:
*/ 返回负数则o1在前,正数则o2在前
class MyComparator implements Comparator<String>{
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
一、按键排序
按Key排序主要用于TreeMap,可以实现按照Key值的大小,在对象插入时直接插入到合适的位置,保持Map的顺序性。
TreeMap的构造函数:TreeMap(Comparator<? super K> comparator):构造一个新的、空的树映射,该映射根据给定比较器进行排序。
实现代码:
public class MapSortTest {
public static void main(String[] args) {
//传进来一个key的比较器对象来构造treemap
Map<String,Integer> map=new TreeMap<>(new MyComparator());
map.put("apple",20);
map.put("boy", 32);
map.put("cat", 100);
map.put("dog", 10000);
map.put("egg", 11);
//map的遍历:把key抽取出来用set存放,然后用迭代器遍历keyset,同时用map.get(KEY)获取key所对应的value。
Set<String> keySet=map.keySet();
Iterator it=keySet.iterator();
while (it.hasNext()) {
String next = (String)it.next();
System.out.println(next+","+map.get(next));
}
}
}
//定义key的比较器
class MyComparator implements Comparator<String>{
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
二、按值排序
1.map.entrySet()方法 将map里的每一个键值对取出来封装成一个Entry对象并存放到一个Set里面
2.泛型Map.Entry<type1,type2> 因为Key-value对组成Entry对象,用于指明Entry对象中这两个成员的数据类型。
3.将MAP中的元素转换为LIST,然后使用Collections.sort()方法对LIST进行排序。
public class MapSortTest {
public static void main(String[] args) {
Map<String,Integer> map=new TreeMap<>();//用TreeMap储存
// Map<String,Integer> map=new HashMap<>();//用HashMap储存
map.put("apple",20);
map.put("boy", 32);
map.put("cat", 100);
map.put("dog", 10000);
map.put("egg", 11);
//1:把map转换成entryset,再转换成保存Entry对象的list。
List<Map.Entry<String,String>> entrys=new ArrayList<>(map.entrySet());
//2:调用Collections.sort(list,comparator)方法把Entry-list排序
Collections.sort(entrys, new MyComparator());
//3:遍历排好序的Entry-list,可得到按顺序输出的结果
for(Map.Entry<String,String> entry:entrys){
System.out.println(entry.getKey()+","+entry.getValue());
}
}
}
//自定义Entry对象的比较器。每个Entry对象可通过getKey()、getValue()获得Key或Value用于比较。换言之:我们也可以通过Entry对象实现按Key排序。
class MyComparator implements Comparator<Map.Entry>{
public int compare(Map.Entry o1, Map.Entry o2) {
return ((String)o1.getValue()).compareTo((String)o2.getValue());
}
}