簡體   English   中英

如何按鍵然后按值對HashMap排序?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM