Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 在HashMap构造中按天对时间戳(日期对象)列表进行分组_Java_Date_Hashmap_Java 7 - Fatal编程技术网

Java 在HashMap构造中按天对时间戳(日期对象)列表进行分组

Java 在HashMap构造中按天对时间戳(日期对象)列表进行分组,java,date,hashmap,java-7,Java,Date,Hashmap,Java 7,我们从时间戳列表开始,时间戳是日期对象。我们需要将属于某一天的所有时间戳分组。例如,当用户登录到我们的服务器时,时间戳被添加到单个列表中。我们希望能够解析这个列表并分离属于同一天的所有日期对象。最终目标是能够在UI上轻松显示按天分隔的所有登录,以及显示每天发生的登录数 EndHashMap构造应如下所示: Key List<Date> 2018-07-11 2018-07-11 08:14:0

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

EndHashMap构造应如下所示:

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 
键列表
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 

这就是我们提出的解决方案。
parseTimeStamps
方法获取
timeStamps
列表,并使用
Calendar
对象将小时、分钟、秒和毫秒设置为0,从而只给我们一天。然后检查
groupedUserLogins
HashMap,查看它是否包含带有该日期的键。如果没有,我们将创建一个日期键,并创建一个新的日期对象列表作为与该键关联的值。随后,我们将时间戳(
ts
)添加到与该天相关联的列表中

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

我创建了以下方法,它返回一个HashMap>,其中键是日期对象,值是日期对象列表。该方法接受时间戳列表并按天对它们进行分组。然后,它返回上述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;
    }
}
public类GroupDatesByDay{
HashMap groupedUserLogins=新HashMap();
Calendar cal=Calendar.getInstance();
公共哈希映射解析时间戳(列表时间戳){
DateFormat DateFormat=新的SimpleDataFormat(“HH:mm:ss.SSS”,Locale.US);
列表时间戳=新的ArrayList();
for(日期ts:时间戳){
校准设定时间(ts);
校准设置(每天校准小时,0);
校准设置(校准分钟,0);
校准设置(校准秒,0);
校准设置(校准毫秒,0);
如果(!groupedUserLogins.containsKey(cal.getTime())){
groupedUserLogins.put(cal.getTime(),new ArrayList());
}
groupedUserLogins.get(cal.getTime()).add(ts);
}
keySet=groupedUserLogins.keySet();
keyList.addAll(键集);
返回组序列号;
}
}
最后我们得到了
groupedUserLogins
,它现在方便地将所有唯一的日期存储为键,指向一个包含时间戳的列表,作为
Date
对象。这种数据结构的最大优点是键和值仍然是
Date
对象,这给了我们未来的灵活性


请随时提供其他解决方案,或改进我所介绍的内容。

这就是我们提出的解决方案。
parseTimeStamps
方法获取
timeStamps
列表,并使用
Calendar
对象将小时、分钟、秒和毫秒设置为0,从而只给我们一天。然后检查
groupedUserLogins
HashMap,查看它是否包含带有该日期的键。如果没有,我们将创建一个日期键,并创建一个新的日期对象列表作为与该键关联的值。随后,我们将时间戳(
ts
)添加到与该天相关联的列表中

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

我创建了以下方法,它返回一个HashMap>,其中键是日期对象,值是日期对象列表。该方法接受时间戳列表并按天对它们进行分组。然后,它返回上述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;
    }
}
public类GroupDatesByDay{
HashMap groupedUserLogins=新HashMap();
Calendar cal=Calendar.getInstance();
公共哈希映射解析时间戳(列表时间戳){
DateFormat DateFormat=新的SimpleDataFormat(“HH:mm:ss.SSS”,Locale.US);
列表时间戳=新的ArrayList();
for(日期ts:时间戳){
校准设定时间(ts);
校准设置(每天校准小时,0);
校准设置(校准分钟,0);
校准设置(校准秒,0);
校准设置(校准毫秒,0);
如果(!groupedUserLogins.containsKey(cal.getTime())){
groupedUserLogins.put(cal.getTime(),new ArrayList());
}
groupedUserLogins.get(cal.getTime()).add(ts);
}
keySet=groupedUserLogins.keySet();
keyList.addAll(键集);
返回组序列号;
}
}
最后我们得到了
groupedUserLogins
,它现在方便地将所有唯一的日期存储为键,指向一个包含时间戳的列表,作为
Date
对象。这种数据结构的最大优点是键和值仍然是
Date
对象,这给了我们未来的灵活性


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

以下是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的实现方法

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

美好的我们的项目仍在Java 7上运行,因此我们无法利用该功能。很好!我们的项目仍在Java 7上运行,因此我们无法利用该功能