[英]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.