在写实验程序时,需要将HashMap按照Value值进行排序。
首先我们需要了解一下HashMap的数据存储方式。按我个人的理解,可以将HashMap就看做一个根据Key值的hashCode进行散列的散列表(哈希),而每个hashCode对应一个K-V对,这个K-V对和我们在C语言中的struct结构体类似,在JAVA中可以看做一个对象中存储了两个值,这个对象就叫做Entry。
HashMap的内部方法entrySet()可以将其存储的Entry转化为集合Set形式存储,获得了这个Set之后,就可以将其加入到列表当中了
例如,我们现在有一个叫做AllTime的HashMap
其中K值类型为PlanningEntry,V值类型为Date
现在需要将PlanningEntry按照其对应的V值Date进行排序
首先创建一个存储类型为Map.Entry<PlanningEntry, Date>的List
然后将entrySet()获得的集合加入到这个list中
List<Map.Entry<PlanningEntry, Date>> list = new LinkedList<Map.Entry<PlanningEntry, Date>>(this.AllTime.entrySet());
//这样获得的list就是存储K-V对(Entry类对象)的列表了
接着需要将list中的Entry类对象进行排序,可以构造自己的Comparator,让list的sort()方法根据该Comparator进行排序。
public class EntryComparatorByDate implements Comparator<Map.Entry<PlanningEntry, Date>> {
//这个Comparator实现了Comparator接口,需要比较类型为Map.Entry<PlanningEntry, Date>
@Override
public int compare(Entry<PlanningEntry, Date> o1, Entry<PlanningEntry, Date> o2) {
Date d1 = o1.getValue();//每个Entry类对象可以根据getValue()方法来获得其中的value值
Date d2 = o2.getValue();
if(d1.before(d2))//比较Date(即Value值)以获得两个Entry的大小关系
return -1;
else if(d1.after(d2))
return 1;
else
return 0;
}
}
这样一来再将原来的list排序即可获得根据Value值排序后的列表了
list.sort(new EntryComparatorByDate());