Java 对地图中的日期字符串排序
嗨,我想根据日期对地图对象进行排序,下面是地图Java 对地图中的日期字符串排序,java,sorting,date,comparator,Java,Sorting,Date,Comparator,嗨,我想根据日期对地图对象进行排序,下面是地图 testMap.put("06/15/2015", 1); testMap.put("05/15/2015", 2); testMap.put("01/15/2016", 4); testMap.put("07/15/2015", 3); testMap.put("02/15/2016", 5); 我需要如下顺序的输出: 2015年5月15日 06/15/2015 07/15/2015 01/15/2016
testMap.put("06/15/2015", 1);
testMap.put("05/15/2015", 2);
testMap.put("01/15/2016", 4);
testMap.put("07/15/2015", 3);
testMap.put("02/15/2016", 5);
我需要如下顺序的输出:
2015年5月15日
06/15/2015
07/15/2015
01/15/2016
2016年2月15日
我需要像2015年的排序月份一样输出,然后按排序顺序从2016年开始
我曾经尝试过使用treemap,但如果日期字符串是日期格式,它通常会起作用,任何人都可以帮助按照上面的顺序排序吗
public class DateAsStringComparator implements Comparator<String>, Serializable {
public int compareTo(String o1, String o2) {
// Convert to Date and compare here.
}
}
然后
final TreeMap<String, Integer> testMap = new TreeMap<>(new DateAsStringComparator());
代码未经测试,但应该给您一个大纲。如果您计划序列化树映射,请确保比较器实现可序列化 您可以通过实现一个比较器并在创建新实例时告诉TreeMap来实现这一点
public class DateAsStringComparator implements Comparator<String>, Serializable {
public int compareTo(String o1, String o2) {
// Convert to Date and compare here.
}
}
然后
final TreeMap<String, Integer> testMap = new TreeMap<>(new DateAsStringComparator());
代码未经测试,但应该给您一个大纲。如果您计划序列化树映射,请确保比较器实现可序列化 为树状图创建自定义比较器:
为树形图创建自定义比较器:
实际上Todd的答案是正确的,我刚刚添加了comparator的实现。 最好将日期比较委托给compareTo方法,该方法内置于java.util.date中
实际上Todd的答案是正确的,我刚刚添加了comparator的实现。 最好将日期比较委托给compareTo方法,该方法内置于java.util.date中
我忍不住觉得这样会创建很多日期对象,这会让事情变慢。我理解,但你必须编写复杂的比较代码。我忍不住觉得这样会创建很多日期对象,这会让事情变慢。我理解,但是你必须编写复杂的比较代码,如果我实现了comparator接口,我需要覆盖接口中的所有方法,对吗?是的。这是两种方法的简单接口。您的IDE可能会为您编写equals方法。如果我实现comparator接口,我需要覆盖该接口中存在的所有方法,对吗?是的。这是两种方法的简单接口。您的IDE可能会为您编写equals方法。您确定这个日期比较正确吗?看起来你只是把整数加起来,组成一个整数,然后比较它们!是的,2015年6月15日变为20150615,2015年5月15日变为20150515,这些整数是可比较的。有点老套,但很有趣。我似乎无法打破它。给我一点时间…也许我不能…为了让它工作,你需要确保日期符合你的比较器所期望的格式。很好!!但我遇到了一些问题。我在下面添加了地图treeMap.put06/15/2015,1;treeMap.put05/15/2015,2;treeMap.put01/15/2016,4;treeMap.put07/15/2015,3;treeMap.put2/15/2016,5但结果我只看到{06/15/2015=3,01/15/2016=5}这里我认为如果日期相同,我的案例日期也会相同:你确定这个日期比较正确吗?看起来你只是把整数加起来,组成一个整数,然后比较它们!是的,2015年6月15日变为20150615,2015年5月15日变为20150515,这些整数是可比较的。有点老套,但很有趣。我似乎无法打破它。给我一点时间…也许我不能…为了让它工作,你需要确保日期符合你的比较器所期望的格式。很好!!但我遇到了一些问题。我在下面添加了地图treeMap.put06/15/2015,1;treeMap.put05/15/2015,2;treeMap.put01/15/2016,4;treeMap.put07/15/2015,3;treeMap.put2/15/2016,5但结果我只看到{06/15/2015=3,01/15/2016=5}这里我认为如果日期相同,我的病例日期将相同,这是有问题的:
public class MyDateComparator implements Comparable<String>
{
public int compareTo( String d1, String d2 )
{
if( d1.matches("\\d{2}\\/\\d{2}\\/\\d{4}") && d2.matches("\\d{2}\\/\\d{2}\\/\\d{4}") )
{
//Valid date format
String[] date_contents = d1.split("/");
java.util.Date date1 = new java.util.Date(date_contents[2], date_contents[0], date_contents[1] );
date_contents = d2.split("/");
java.util.Date date2 = new java.util.Date(date_contents[2], date_contents[0], date_contents[1] );
return date1.compareTo(date2);
}
return d1.compareTo(d2);
}
});
Map<String, String> treeMap = new TreeMap<String, String>(new MyDateComparator());