Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对地图中的日期字符串排序_Java_Sorting_Date_Comparator - Fatal编程技术网

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());