繁体   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