可以通过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())即可。

http://img.mukewang.com/climg/6101049509d2e99109670357.jpg

祝学习愉快~

0

0 学习 · 16556 问题

查看课程