java - 如何以字符串类型按日历对 map 进行排序?

标签 java date

我有这样的结构:

Map<String, String> map = new HashMap<String, String>();

数据如下所示:

("10/11/2015", "A")
("10/12/2015", "B")
("10/13/2015", "C")
("10/14/2015", "D")
("10/15/2015", "E")

我想按日期(键)对 map 进行排序,因此我尝试将字符串转换为日历类型,然后将它们移动到 TreeMap 中,如下所示:

DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
Calendar calendar = Calendar.getInstance();

TreeMap<Calendar, String> tree = new TreeMap<Calendar, String>();

for(Map.Entry<String, String> entry : map.entrySet()){
    String key = entry.getKey();
    String value =  entry.getValue();

    calendar.setTime(formatter.parse(key));
    tree.put(calendar, value);
}

但是当我打印 key 时,结果如下所示:

10/11/2015
10/15/2015
10/14/2015
10/12/2015
10/13/2015

如何正确按日期(字符串类型的日期)对 map 进行排序?

最佳答案

根据您的示例,您最终应该得到 TreeMap与单个Calendar键,因为您使用的是 Calendar 的同一个实例.

相反,如果您使用 Calendar 的新实例对于每个条目,例如...

    DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

    Map<String, String> map = new HashMap<>();
    map.put("10/11/2015", "A");
    map.put("10/12/2015", "B");
    map.put("10/13/2015", "C");
    map.put("10/14/2015", "D");
    map.put("10/15/2015", "E");

    TreeMap<Calendar, String> tree = new TreeMap<Calendar, String>();

    for (Map.Entry<String, String> entry : map.entrySet()) {
        System.out.println(entry);
        String key = entry.getKey();
        String value = entry.getValue();

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(formatter.parse(key));
        tree.put(calendar, value);
    }

    for (Calendar key : tree.keySet()) {
        System.out.println(key.getTime());
    }

它会打印出更像...的内容

Sun Oct 11 00:00:00 EST 2015
Mon Oct 12 00:00:00 EST 2015
Tue Oct 13 00:00:00 EST 2015
Wed Oct 14 00:00:00 EST 2015
Thu Oct 15 00:00:00 EST 2015

如果您使用的是 Java 8(+),那么您确实应该使用新的日期/时间 API,例如...

Map<LocalDate, String> tree = new TreeMap<>();

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry);
    String key = entry.getKey();
    String value = entry.getValue();

    LocalDate ld = LocalDate.parse(key, DateTimeFormatter.ofPattern("MM/dd/yyyy"));
    tree.put(ld, value);
}

for (LocalDate key : tree.keySet()) {
    System.out.println(key);
}

关于java - 如何以字符串类型按日历对 map 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32857346/

相关文章:

java - 为什么即使添加到 JScrollPane 中,JTable 也不显示 Jtable 标题?

java - Android baseAdapter 在向上滚动时停止评估 if 语句

java - 如何在spring MVC中获取应用程序路径

sql - 从 Oracle 中的日期获取月份名称

Java:将字符串日期转换为月份名称年份 (MMM yyyy)

java - 为什么 SimpleDateFormat 将 unix 日期显示为 1969 年 12 月 31 日?

java - h :selectOneRadio HTML output for jsf 1. 1 对 2.0

java - 如果列为空,则 DynamicReports 删除行

javascript - 谷歌应用程序脚本中的减去天数将不会反射(reflect)当年的正确更改

javascript - 当输入类型日期和输入类型时间使用相同的ng-model时,如何清除仅日期或仅时间?