Java 按键对HashMap排序后,如果键匹配,如何按值排序

Java 按键对HashMap排序后,如果键匹配,如何按值排序,java,Java,因此,使用树映射,我能够按键(日期)对HashMap进行排序,但我要完成的下一件事是,如果日期相同,那么我希望按值(时间)进行排序。有人能建议怎么做吗 以下是按键正确排序的相关代码: public void eventList(){ int year = -1; if(MyCalendarTester.myCal.getMyCalHash().equals(null)){ System.out.println("Your calendar is empty!")

因此,使用树映射,我能够按键(日期)对HashMap进行排序,但我要完成的下一件事是,如果日期相同,那么我希望按值(时间)进行排序。有人能建议怎么做吗

以下是按键正确排序的相关代码:

public void eventList(){

    int year = -1;
    if(MyCalendarTester.myCal.getMyCalHash().equals(null)){
        System.out.println("Your calendar is empty!");
    }
    else{
        System.out.println("Here are your events: ");
        SortedSet<GregorianCalendar> keys = new TreeSet<GregorianCalendar>(MyCalendarTester.myCal.getMyCalHash().keySet());

        for(GregorianCalendar key : keys){
            Event value = MyCalendarTester.myCal.getMyCalHash().get(key);
            if(value.endTime != null){
                if(key.get(Calendar.YEAR) == year){

                    System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY_OF_WEEK) - 1] + ", " + MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH) - 1] + " "
                            + key.get(Calendar.DATE) + " " + value.startTime.get(Calendar.HOUR_OF_DAY) + ":" + value.startTime.get(Calendar.MINUTE) + " - " + value.endTime.get(Calendar.HOUR_OF_DAY) 
                            + ":" + value.endTime.get(Calendar.MINUTE) + " " + value.eventName);

                }else{
                    System.out.println(key.get(Calendar.YEAR));
                    System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY_OF_WEEK) - 1] + ", " + MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH) - 1] + " "
                            + key.get(Calendar.DATE) + " " + value.startTime.get(Calendar.HOUR_OF_DAY) + ":" + value.startTime.get(Calendar.MINUTE) + " - " + value.endTime.get(Calendar.HOUR_OF_DAY) 
                            + ":" + value.endTime.get(Calendar.MINUTE) + " " + value.eventName );
                    year = key.get(Calendar.YEAR);
                }

            }else{
                if(key.get(Calendar.YEAR) == year){
                    System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY_OF_WEEK) - 1] + ", " + MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH) - 1] + " "
                            + key.get(Calendar.DATE) + " " + value.startTime.get(Calendar.HOUR_OF_DAY) + ":" + value.startTime.get(Calendar.MINUTE) + " " + value.eventName);

                }else{
                    System.out.println(key.get(Calendar.YEAR));
                    System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY_OF_WEEK) - 1] + ", " + MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH) - 1] + " "
                            + key.get(Calendar.DATE) + " " + value.startTime.get(Calendar.HOUR_OF_DAY) + ":" + value.startTime.get(Calendar.MINUTE)  + " " + value.eventName);
                    System.out.println();
                    year = key.get(Calendar.YEAR);
                }
            }

        }

    }

}
public void eventList(){
整年=-1;
if(MyCalendarTester.myCal.getMyCalHash().equals(null)){
System.out.println(“您的日历是空的!”);
}
否则{
System.out.println(“这是您的事件:”);
SortedSet keys=新树集(MyCalendarTester.myCal.getMyCalHash().keySet());
用于(GregorianCalendar键:键){
事件值=MyCalendarTester.myCal.getMyCalHash().get(键);
如果(value.endTime!=null){
if(key.get(Calendar.YEAR)=年){
System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY\u OF u WEEK)-1]+,“+MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH)-1]+”
+key.get(Calendar.DATE)+“”+value.startTime.get(Calendar.HOUR\u OF u DAY)+“:“+value.startTime.get(Calendar.MINUTE)+“-”+value.endTime.get(Calendar.HOUR\u OF u DAY)
+“:”+value.endTime.get(Calendar.MINUTE)+“+value.eventName);
}否则{
System.out.println(key.get(Calendar.YEAR));
System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY\u OF u WEEK)-1]+,“+MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH)-1]+”
+key.get(Calendar.DATE)+“”+value.startTime.get(Calendar.HOUR\u OF u DAY)+“:“+value.startTime.get(Calendar.MINUTE)+“-”+value.endTime.get(Calendar.HOUR\u OF u DAY)
+“:”+value.endTime.get(Calendar.MINUTE)+“+value.eventName);
年份=key.get(日历年);
}
}否则{
if(key.get(Calendar.YEAR)=年){
System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY\u OF u WEEK)-1]+,“+MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH)-1]+”
+key.get(Calendar.DATE)+“”+value.startTime.get(Calendar.HOUR\u OF_DAY)+”:“+value.startTime.get(Calendar.MINUTE)+“”+value.eventName);
}否则{
System.out.println(key.get(Calendar.YEAR));
System.out.println(MyCalendarTester.arrayOfDays[key.get(Calendar.DAY\u OF u WEEK)-1]+,“+MyCalendarTester.arrayOfMonths[key.get(Calendar.MONTH)-1]+”
+key.get(Calendar.DATE)+“”+value.startTime.get(Calendar.HOUR\u OF_DAY)+”:“+value.startTime.get(Calendar.MINUTE)+“”+value.eventName);
System.out.println();
年份=key.get(日历年);
}
}
}
}
}

您需要创建一个自定义比较器,用于嵌入密钥的两个组件

(date, time).  
这样,您的数据将首先按日期排序,然后按时间排序

您可以通过将(日期、时间)组合成一个元组,然后在比较器中使用元组compareTo来实现这一点

更新
如果您不希望更改键项(顺便说一句,这是map/reduce中用于二次排序的常见模式。),另一个选项是:将值项设置为已排序的集合,并迭代比较集合项

可通过以下方式进行比较:

merge()

合并排序逻辑:两个列表需要按降序分别排序。然后开始合并列表。这里的区别是,一旦发现任何差异,然后返回包含给定条目的列表,您需要创建一个嵌入键的两个组件的自定义比较器

(date, time).  
这样,您的数据将首先按日期排序,然后按时间排序

您可以通过将(日期、时间)组合成一个元组,然后在比较器中使用元组compareTo来实现这一点

更新
如果您不希望更改键项(顺便说一句,这是map/reduce中用于二次排序的常见模式。),另一个选项是:将值项设置为已排序的集合,并迭代比较集合项

可通过以下方式进行比较:

merge()

合并排序逻辑:两个列表需要按降序分别排序。然后开始合并列表。这里的区别是,一旦发现任何差异,然后返回包含给定条目的列表,您需要创建一个嵌入键的两个组件的自定义比较器

(date, time).  
这样,您的数据将首先按日期排序,然后按时间排序

您可以通过将(日期、时间)组合成一个元组,然后在比较器中使用元组compareTo来实现这一点

更新
如果您不希望更改键项(顺便说一句,这是map/reduce中用于二次排序的常见模式。),另一个选项是:将值项设置为已排序的集合,并迭代比较集合项

可通过以下方式进行比较:

merge()

合并排序逻辑:两个列表需要按降序分别排序。然后开始合并列表。这里的区别是,一旦发现任何差异,然后返回包含给定条目的列表,您需要创建一个嵌入键的两个组件的自定义比较器

(date, time).  
这样,您的数据将首先按日期排序,然后按时间排序

您可以通过将(日期、时间)组合成一个元组,然后在比较器中使用元组compareTo来实现这一点

更新
如果您不希望更改键条目(顺便说一句,这是map/reduce中用于二次排序的常见模式),另一个选项是:将您的值条目设置为已排序的集合,并迭代比较coll