我需要一些有关流API的帮助。我需要根据位置对对象列表进行分组,如果位置相同,但日期不同,而不考虑时间,则按1递增计数。我已经提供了带有getters、setter、data和预期输出的类的以下代码。
public class Event {
String location;
String date;
String count;
public String getCount() {
return count;
}
public void setCount(String count) {
this.count = count;
}
public String getLocation() {
return location;
}
public String getDate() {
return date;
}
public void setLocation(String location) {
this.location = location;
}
public void setDate(String date) {
this.date = date;
}
}
事件类的数据:
Event event = new Event();
event.setLocation("98.55.62.162");
event.setDate("09/17/2022 12:05:43 PM");
event.add(event);
event.setLocation("98.55.62.162");
event.setDate("09/16/2022 12:05:45 PM");
event.add(event);
event.setLocation("98.55.62.162");
event.setDate("09/16/2022 12:05:47 PM");
event.add(event);
event.setLocation("98.55.62.162");
event.setDate("09/15/2022 12:05:49 PM");
event.add(event);
event.setLocation("98.55.62.163");
event.setDate("09/17/2022 12:05:31 PM");
event.add(event);
event.setLocation("98.55.62.163");
event.setDate("09/16/2022 12:05:22 PM");
event.add(event);
event.setLocation("98.55.62.163");
event.setDate("09/16/2022 12:05:11 PM");
event.add(event);
我试着让Map<String, List<Event>>
Map<String, List<Event>> eventMap = events.stream().collect(Collectors.groupingBy(s -> s.getLocation()));
这对我不起作用。
我需要像Map<字符串,整数>Map的输出,其中字符串是位置和计数是基于日期。如果日期不同,则按1递增。时间在这里并不重要。我不确定如何使用流API或for循环对它们进行分组。
o/p: ["98.55.62.162":3 , "98.55.62.163":2]
2条答案
按热度按时间vsdwdz231#
这是可能的,但有点棘手。检查一下这个
flseospp2#
此答案基于the answer by Demian。我做了以下更改:
1.将
Locale.ENGLISH
与DateTimeFormatter
一起使用,这对于日期-时间值不是强制的,但强烈建议使用,因为日期-时间格式化/解析API对Locale
敏感。1.保持
Event#date
的类型为String
,而我建议您在构造Event
对象时使用LocalDateTime
并解析字符串日期-时间字符串,就像Demian在他的回答中所做的那样。如果日、月、年、小时、分钟等具有单独的值,则可以使用LocalDateTime#of
方法之一填充Event#date
。1.使用
.map(e -> LocalDateTime.parse(e.getDate(), formatter).toLocalDate())
:在这个Map中,我首先将Event#date
解析为LocalDateTime
,然后使用LocalDateTime#toLocalDate
仅提取日期部分输出:
从**Trail: Date Time**了解有关modern date-time API的更多信息。