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,会发现还是未排序状态的。
要是有啥写的不对的地方,欢迎指正~