可以通过Comparble和Comparator对map中的元素进行排序吗?
来源:4-3 案例:对商品价格进行降序排序
晓舟
2021-07-28 13:10:22
好像又感觉不行 因为map中的元素是无序的。。
1回答
好帮手慕小小
2021-07-28
同学你好,是可以通过Comparator对map集合进行排序的,以TreeMap、HashMap为例:
一、TreeMap
向TreeMap中添加key-value数据时,要求key必须是相同类型的数据,因为要按照key进行排序,TreeMap默认是升序的,如果需要改变排序方式,则需要使用比较器:Comparator。示例代码如下:
1)根据TreeMap的key值来进行排序
public static void main(String[] args) {
Map<String, String> map = new TreeMap<>(new Comparator<String>() {
public int compare(String o1, String o2) {
return o2.compareTo(o1);// 降序排序
}
});
map.put("c", "ccccc");
map.put("a", "aaaaa");
map.put("b", "bbbbb");
map.put("d", "ddddd");
//遍历map集合
Set<String> keySet = map.keySet();
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = it.next();
System.out.println(key + ":" + map.get(key));
}
}2)根据TreeMap的value来进行排序,需要将将map.entrySet()转换成list后,再借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。如下:
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("d", "ddddd");
map.put("b", "bbbbb");
map.put("a", "aaaaa");
map.put("c", "ccccc");
Set<Entry<String,String>> entrySet = map.entrySet();
// 将map.entrySet()转换成list
List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(entrySet);
Collections.sort(list, new Comparator<Map.Entry<String, String>>() { // 通过比较器来实现排序
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
return o2.getValue().compareTo(o1.getValue());// 降序排序
}
});
for (Map.Entry<String, String> mapping : list) {
System.out.println(mapping.getKey() + ":" + mapping.getValue());
}
}二、HashMap
HashMap的值是没有顺序的,它是按照key的HashCode来实现的。对于这个无序的HashMap进行排序可参照TreeMap的value排序的方式进行排序。
1)按照key值进行排序,代码实现如下:
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("c", "ccccc");
map.put("a", "aaaaa");
map.put("b", "bbbbb");
map.put("d", "ddddd");
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
// 升序排序
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
for (Map.Entry<String, String> mapping : list) {
System.out.println(mapping.getKey() + ":" + mapping.getValue());
}
}2)按照value值进行排序,只需要将compare方法中的方法返回值修改为:
return o1.getValue().compareTo(o2.getValue())即可。

祝学习愉快~
相似问题
回答 2