[英]How to sort a HashMap by Keys and then Values?
我有以下HashMap
HashMap<GregorianCalendar, Event> calHash new HashMap<GregorianCalendar, Event>();
通过执行以下操作,我可以按键对其进行排序:
SortedSet<GregorianCalendar> keys = new TreeSet<GregorianCalendar>(calHash.keySet());
我还使Event类实现了Comparable并重写了compareTo方法,如下所示:
@Override
public int compareTo(Object e) {
// TODO Auto-generated method stub
int hour = ((Event) e).getStartTime().get(Calendar.HOUR_OF_DAY);
int minute = ((Event) e).getStartTime().get(Calendar.MINUTE);
int anotherHour = this.startTime.get(Calendar.HOUR_OF_DAY);
int anotherMinute = this.startTime.get(Calendar.MINUTE);
if(anotherHour - hour == 0 ){
return anotherMinute - minute;
}else{
return anotherHour - hour;
}
return 0;
}
}
通过以上操作,我可以按升序对事件(值)进行排序。 现在我的问题是,如何先按键对我的HashMap排序,然后如果同一个键具有多个值(安排了不同时间的事件),然后对它进行排序?
我似乎只能找到如何对一种方式进行排序,而现在却对两种方式都进行双重排序。
使用calHash.entrySet()
。 这将为您提供一组Map.Entry
,然后可以将其转储到new LinkedList<Map.Entry>(entrySet)
。
然后,您可以使用Collections.sort(list, comparator)
和一个自定义比较器对该列表进行排序,该自定义比较器按一个条件对这些条目进行排序,如果该条件相同,则按另一个条件进行排序。
这是一个匿名比较器示例:
Collections.sort(list, new Comparator<Map.Entry>() {
public int compare(Map.Entry e1, Map.Entry e2) {
// do comparisons here
return 0;
}
});
映射不能有多个具有相同键的条目,因此按键和值进行排序需要花费更多的工作。
也许最简单的方法是制作一个新的Map<GregorianCalendar, List<Event>>
,其中Map中的每个条目都将一个键映射到事件列表。
如果您同时有多个事件,则可以将事件添加到列表中。
然后,您可以使用Collections.sort()
对列表进行排序。
顺便说一句,您可以使用TreeMap
而不是创建Hashmap来创建排序的Map,然后仅对键进行单独的SortedSet。
Map<GregorianCalendar, List<Event>> map = new TreeMap<>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.