HashMap如何按值value排序

简单介绍相关组件

HashMap

我们知道,HashMap是一个数组和链表组成的一种链表散列结构,存储方式是根据key的hash值来决定存储的位置,这就导致了存储后的元素不会维持插入时的顺序。

Comparator

如果我们需要控制某个类的次序并且该类本身不支持排序,那么就可以建立一个类比较器来进行排序,实现方式很简单只需要实现java.util.Comparator接口。

Collections.sort方法

Collections.sort(List list,new Comparator(){
@override
public int compare( o1, o2){
return 0;
}
});
表示对传入的list进行排序,排序方法需要在comparator接口中重写,按return值进行排序,小于0降序,大于0升序
,一般是对o1和o2两个对象的某个属性进行比较得出结果。

实现原理简介

由于HashMap不属于list子类,所以无法使用Collections.sort方法来进行排序,所以我们将hashmap中的entryset取出放入一个ArrayList中,来对ArrayList中的entryset进行排序(根据entryset中value的值),达到我们对hashmap的值进行排序的效果。

实现代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SortHashMap{
	public static void main(String[] args) {
		//产生一个map并添加一些参数
		Map<String,Integer> map = new HashMap<>();
		map.put("ddd", 1);
		map.put("aaa", 2);
		map.put("bbb", 3);
		map.put("ccc", 4);
		
		List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet()); //将map的entryset放入list集合
		//对list进行排序,并通过Comparator传入自定义的排序规则
		Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() {
			@Override
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
				return o1.getValue()-o2.getValue(); //重写排序规则,小于0表示升序,大于0表示降序
			}
		});
		//用迭代器对list中的键值对元素进行遍历
		Iterator<Map.Entry<String, Integer>> iter = list.iterator();
		while(iter.hasNext()){
			Map.Entry<String, Integer> item = iter.next();
			String key = item.getKey();
			int value = item.getValue();
			System.out.println("键"+key+"值"+value);
		}
	}
}

tips

遍历时应该遍历list,因为我们使用Collections.sort所完成的排序是针对传入的list,如果遍历hashmap,会发现还是未排序状态的。

要是有啥写的不对的地方,欢迎指正~

猜你喜欢

转载自blog.csdn.net/weixin_43495429/article/details/86630017