Java 按键对HashMap排序后,如果键匹配,如何按值排序
因此,使用树映射,我能够按键(日期)对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!")
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