Map集合利⽤⽐较器Comparator根据Key和Value的排序
TreeMap排序
根据Key进⾏排序
Map的根据key排序需要⽤到TreeMap对象,因为它是默认按照升序进⾏输出的,可以使⽤⽐较器compareTo对它进⾏降序排序,Comparator可以对集合对象或者数组进⾏排序的⽐较器接⼝,实现该接⼝的public compare(T o1,To2)⽅法即可实现排序,该⽅法主要是根据第⼀个参数o1,⼩于、等于或者⼤于o2分别返回负整数、0或者正整数,若是按照升序可以直接省略⽐较器代码Map<String, String> treeMap = new TreeMap<String, String>();
如下代码
Java
Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// return o1pareTo(o2); // 默认:升序排列
return o2pareTo(o1);  // 降序排列
// return 0;    // 只返回存储的第⼀个key的值,这⾥是"ccccc"
}
});
treeMap.put("c", "ccccc");
treeMap.put("a", "aaaaa");
treeMap.put("b", "bbbbb");
treeMap.put("d", "ddddd");
for (String key : treeMap.keySet()) {
System.out.println(key+" : "+(key));
}
输出:
d : ddddd
c : ccccc
b : bbbbb
a : aaaaa
根据value排序
对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)⽅法,该⽅法根据指定⽐较器产⽣的顺序对指定列表进⾏排序。但是有⼀个前提条件,那就是所有的元素都必须能够根据所提供的⽐较器来进⾏⽐较。
这种⽅法通⽤于key和value排序,只需将⽐较器中o1.getValue()Value())的getValue()改为getKey()即可。
如下:
Java
Map<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("c", "jock");
java集合排序怎么实现treeMap.put("a", "rapido");
treeMap.put("d", "free");
treeMap.put("b", "linda");
// 这⾥将Set()转换成list
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(Set());
// 然后通过⽐较器来实现排序
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
@Override
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
// return 0;  // 降序
// Value()Value()); // 降序
Value()Value()); // 升序
}
});
for (Map.Entry<String, String> mapping : list) {
System.out.Key() + ":" + Value());
}
输出:
d:free
c:jock
b:linda
a:rapido
注意:
经过上⾯⽰例代码的测试发现,
使⽤第⼀种匿名内部类⽅式进⾏key排序,⽐较器返回的若是0,则值只有第⼀条⾸先插⼊的输出,⽽且只输出⼀条数据。
使⽤第⼆种list和⽐较器⽅式进⾏key或value排序,⽐较器返回的若是0,则值和倒序的值⼀样,有多少输出多少。(若有朋友知道原因还请⽂章下留⾔,谢谢)
HashMap排序
我们都是HashMap的值是没有顺序的,他是按照key的HashCode来实现的。对于这个⽆序的HashMap
我们要怎么来实现排序呢?参照TreeMap的value排序,我们⼀样的也可以实现HashMap的排序。
经过Key排序
与TreeMap的根据value⽐较⽅式⼀样,将new TreeMap<String, String>();改为new HashMap<String, String>(),再将⽐较器的getValue换成getKey就⾏。
经过value排序
与TreeMap的根据value⽐较⽅式⼀样,将new TreeMap<String, String>();改为new HashMap<String, String>();就⾏。
其他的Map类型排序都可参考以上⽅法进⾏

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。