我们从时间戳列表开始,它们是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
答案 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}}对象,为我们提供了未来的灵活性。
请随时提供替代解决方案,或者对我介绍的内容进行改进。