在HashMap构造中按天将时间戳列表(Date对象)分组

时间:2018-07-13 16:35:47

标签: java date hashmap java-7

我们从时间戳列表开始,它们是Date对象。我们需要将属于唯一一天的所有时间戳分组。例如,当用户登录我们的服务器时,时间戳将添加到单个列表中。我们希望能够解析此列表并分离属于同一天的所有Date对象。最终目标是能够轻松地在UI上显示按天分隔的所有登录,以及显示每天发生的登录数量。

HashMap的最终构造应如下所示:

Key                          List<Date> 

2018-07-11 
                  2018-07-11 08:14:08.540000 
                  2018-07-11 10:46:23.575000 

2018-07-12  
                  2018-07-12 12:51:48.928000 
                  2018-07-12 13:09:00.701000 
                  2018-07-12 16:04:45.890000 

2018-07-13 
                  2018-07-13 14:14:17.461000 

2 个答案:

答案 0 :(得分:2)

这是java8的实现方式。

List<LocalDateTime> loginTimes = Arrays.asList(LocalDateTime.of(2018, 5, 7, 8, 10),
        LocalDateTime.of(2018, 5, 7, 9, 15, 20), LocalDateTime.of(2018, 6, 22, 7, 40, 30));
Map<LocalDate, Long> loginCountByDate = loginTimes.stream()
        .collect(Collectors.groupingBy(LocalDateTime::toLocalDate, Collectors.counting()));

首先按日期对登录时间进行分组,然后按每个日期计算登录次数。这是我建议的最佳解决方案,但是它要求您使用Java8。

这是输出。

{2018-05-07=2, 2018-06-22=1}

答案 1 :(得分:0)

这是我们想出的解决方案。 parseTimeStamps方法将迭代timeStamps的列表,并使用Calendar对象将小时,分钟,秒和毫秒设置为0,从而使我们得到一天。然后,我们检查我们的groupedUserLogins HashMap,看它是否包含具有该日期的密钥。如果不是,我们将在当天创建一个键,并创建一个新的Date对象列表作为与该键关联的值。随后,我们将时间戳记(ts)添加到与当天相关联的列表中。

在下一次迭代中,如果我们在HashMap中遇到与剥离后的Calender对象匹配的键,我们会立即将该时间戳(ts)添加到与该现有日期关联的列表中。

我创建了以下方法,该方法返回一个HashMap>,其中键是Date对象,而值是Date对象列表。该方法接受timeStamps列表,并按天对它们进行分组。然后,它返回上述HashMap构造中的分组时间戳。

 public class GroupDatesByDay {

    HashMap<Date, List<Date>> groupedUserLogins = new HashMap<Date, List<Date>>();
    Calendar cal = Calendar.getInstance();

    public HashMap<Date, List<Date>> parseTimeStamps(List<Date> timeStamps) {

    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS", Locale.US);
    List<Date> timeStamps = new ArrayList<Date>();

        for (Date ts : timeStamps) {

            cal.setTime(ts);
            cal.set(cal.HOUR_OF_DAY, 0);
            cal.set(cal.MINUTE, 0);
            cal.set(cal.SECOND, 0);
            cal.set(cal.MILLISECOND, 0);

            if (!groupedUserLogins.containsKey(cal.getTime())) {

                groupedUserLogins.put(cal.getTime(), new ArrayList<Date>());
            }
            groupedUserLogins.get(cal.getTime()).add(ts);
        }

        keySet = groupedUserLogins.keySet();
        keyList.addAll(keySet);
        return groupedUserLogins;
    }
}

我们以groupedUserLogins结尾,该Date现在已方便地将所有唯一的日期存储为指向包含我们的时间戳的List的键作为Date对象。这种数据结构的最大优点是键和值仍然是{{1}}对象,为我们提供了未来的灵活性。

请随时提供替代解决方案,或者对我介绍的内容进行改进。