从 children 出生人数最多的新生儿列表中获取日期
Get date from the List of newborn on which the most children were born
我有一个File.txt(代表NewBorn
)。
我创建了一个 class NewBorn
,其中包含以下字段:id
、name
、age
.
然后我正在读取文件并解析它,所以我可以获得一个不错的输出。
从新生儿列表(基于file.txt)我需要得到最children 出生了,但我在筛选时遇到了问题。
这就是我试过的方法:
public static List<NewBorn> dateInWitchMostChildrenAreBorn(List<NewBorn> newBornList) {
return newBornList.stream()
.filter(newBorn -> newBorn.getBirthdate() // in here I tried to go use = but is not good of course )
//then I want to collect that and count the one that is the most in witch children are born
.collect((Collectors.toSet()));
}
这里,首先过滤null birthdate
,然后按生日分组,然后收集到一个Map中,以birthdate
为键,出现次数为值,然后返回最大出现次数birthdate
public static LocalDate dateInWitchMostChildrenAreBorn(List<NewBorn> newBornList) {
return newBornList.stream()
.filter(newBorn -> Objects.nonNull(newBorn.getBirthdate()))
.collect(Collectors.groupingBy(NewBorn::getBirthdate, Collectors.counting()))
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey).orElse(null);
}
可能有多个日期 children 的出生人数相等。因此,可以有多个日期对应最大个新生儿数。也许这就是为什么问题中列出的方法意味着 return a list.
为了获得包含新生儿数量最大的所有日期的List<LocalDate>
,首先,我们需要创建map Map<LocalDate, Long>
(按日期计算的新生儿人数)通过使用收集器Collectors.groupingBy()
。提取 生日 的 函数 用作第一个参数, Collectors.counting()
生成映射到键的元素数,作为 下游收集器.
然后我们可以在 单次传递 中使用 custom 生成结果列表收集器,它将收集具有最高先前遇到的 计数的条目。如果下一个条目的值大于前一个最大值,将清除中间结果。
要实现自定义收集器,我们可以利用Collector
接口中定义的静态方法of()
。
ArrayDeque
用作收集器的可变容器。
finisher 函数 在生成的 queue 上创建一个流,它从条目中提取日期 objects 并收集它们进入列表.
public static List<LocalDate> dateInWitchMostChildrenAreBorn(List<NewBorn> newBornList) {
return newBornList.stream()
.collect(Collectors.groupingBy(NewBorn::getBirthdate,
Collectors.counting())) // Map<LocalDate, Long> - number of newborns by date
.entrySet().stream()
.collect(Collector.of(
ArrayDeque::new, // supplier
(Queue<Map.Entry<LocalDate, Long>> queue,
Map.Entry<LocalDate, Long> next) -> { // accumulator
if (!queue.isEmpty() && queue.element().getValue() < next.getValue()) queue.clear();
if (queue.isEmpty() || queue.element().getValue().equals(next.getValue())) queue.add(next);
},
(Queue<Map.Entry<LocalDate, Long>> left,
Queue<Map.Entry<LocalDate, Long>> right) -> { // combiner
if (left.isEmpty()) return right;
if (right.isEmpty()) return left;
if (left.element().getValue() < right.element().getValue()) return right;
if (left.element().getValue() > right.element().getValue()) return left;
else {left.addAll(right); return left;}
},
(Queue<Map.Entry<LocalDate, Long>> queue) -> // finisher
queue.stream().map(Map.Entry::getKey).toList()
));
}
main()
- 演示
public static void main(String[] args) {
List<NewBorn> newBorns =
List.of(new NewBorn(LocalDate.of(2021, 1, 5)),
new NewBorn(LocalDate.of(2021, 3, 8)),
new NewBorn(LocalDate.of(2021, 3, 8)),
new NewBorn(LocalDate.of(2021, 12, 10)),
new NewBorn(LocalDate.of(2021, 12, 10)),
new NewBorn(LocalDate.of(2021, 1, 5)),
new NewBorn(LocalDate.of(2021, 5, 25)),
new NewBorn(LocalDate.of(2021, 7, 12)));
System.out.println(dateInWitchMostChildrenAreBorn(newBorns));
}
Output (expected : 新生儿数量为2
的三个日期
[2021-12-10, 2021-03-08, 2021-01-05]
你也可以用这个
第一个列表不应该在那里,因为你想 return 一个 LocalDate
如果 类 之间的关系正确,这应该有效:
如有任何问题,请告诉我:)
public LocalDate mostCommonDate() {
Map<LocalDate, Integer> map = new HashMap<>();
for (Newborn newborn : newborns) {
Integer value = map.get(newborn.getBirthday());
map.put(newborn.getBirthday(), (value == null) ? 1 : value + 1);
}
Entry<LocalDate, Integer> max = null;
for (Entry<LocalDate, Integer> entry : map.entrySet()) {
if (max == null || max.getValue() > entry.getValue()) {
max = entry;
}
}
return max.getKey();
}
我有一个File.txt(代表NewBorn
)。
我创建了一个 class NewBorn
,其中包含以下字段:id
、name
、age
.
然后我正在读取文件并解析它,所以我可以获得一个不错的输出。
从新生儿列表(基于file.txt)我需要得到最children 出生了,但我在筛选时遇到了问题。
这就是我试过的方法:
public static List<NewBorn> dateInWitchMostChildrenAreBorn(List<NewBorn> newBornList) {
return newBornList.stream()
.filter(newBorn -> newBorn.getBirthdate() // in here I tried to go use = but is not good of course )
//then I want to collect that and count the one that is the most in witch children are born
.collect((Collectors.toSet()));
}
这里,首先过滤null birthdate
,然后按生日分组,然后收集到一个Map中,以birthdate
为键,出现次数为值,然后返回最大出现次数birthdate
public static LocalDate dateInWitchMostChildrenAreBorn(List<NewBorn> newBornList) {
return newBornList.stream()
.filter(newBorn -> Objects.nonNull(newBorn.getBirthdate()))
.collect(Collectors.groupingBy(NewBorn::getBirthdate, Collectors.counting()))
.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey).orElse(null);
}
可能有多个日期 children 的出生人数相等。因此,可以有多个日期对应最大个新生儿数。也许这就是为什么问题中列出的方法意味着 return a list.
为了获得包含新生儿数量最大的所有日期的List<LocalDate>
,首先,我们需要创建map Map<LocalDate, Long>
(按日期计算的新生儿人数)通过使用收集器Collectors.groupingBy()
。提取 生日 的 函数 用作第一个参数, Collectors.counting()
生成映射到键的元素数,作为 下游收集器.
然后我们可以在 单次传递 中使用 custom 生成结果列表收集器,它将收集具有最高先前遇到的 计数的条目。如果下一个条目的值大于前一个最大值,将清除中间结果。
要实现自定义收集器,我们可以利用Collector
接口中定义的静态方法of()
。
ArrayDeque
用作收集器的可变容器。
finisher 函数 在生成的 queue 上创建一个流,它从条目中提取日期 objects 并收集它们进入列表.
public static List<LocalDate> dateInWitchMostChildrenAreBorn(List<NewBorn> newBornList) {
return newBornList.stream()
.collect(Collectors.groupingBy(NewBorn::getBirthdate,
Collectors.counting())) // Map<LocalDate, Long> - number of newborns by date
.entrySet().stream()
.collect(Collector.of(
ArrayDeque::new, // supplier
(Queue<Map.Entry<LocalDate, Long>> queue,
Map.Entry<LocalDate, Long> next) -> { // accumulator
if (!queue.isEmpty() && queue.element().getValue() < next.getValue()) queue.clear();
if (queue.isEmpty() || queue.element().getValue().equals(next.getValue())) queue.add(next);
},
(Queue<Map.Entry<LocalDate, Long>> left,
Queue<Map.Entry<LocalDate, Long>> right) -> { // combiner
if (left.isEmpty()) return right;
if (right.isEmpty()) return left;
if (left.element().getValue() < right.element().getValue()) return right;
if (left.element().getValue() > right.element().getValue()) return left;
else {left.addAll(right); return left;}
},
(Queue<Map.Entry<LocalDate, Long>> queue) -> // finisher
queue.stream().map(Map.Entry::getKey).toList()
));
}
main()
- 演示
public static void main(String[] args) {
List<NewBorn> newBorns =
List.of(new NewBorn(LocalDate.of(2021, 1, 5)),
new NewBorn(LocalDate.of(2021, 3, 8)),
new NewBorn(LocalDate.of(2021, 3, 8)),
new NewBorn(LocalDate.of(2021, 12, 10)),
new NewBorn(LocalDate.of(2021, 12, 10)),
new NewBorn(LocalDate.of(2021, 1, 5)),
new NewBorn(LocalDate.of(2021, 5, 25)),
new NewBorn(LocalDate.of(2021, 7, 12)));
System.out.println(dateInWitchMostChildrenAreBorn(newBorns));
}
Output (expected : 新生儿数量为2
的三个日期
[2021-12-10, 2021-03-08, 2021-01-05]
你也可以用这个 第一个列表不应该在那里,因为你想 return 一个 LocalDate 如果 类 之间的关系正确,这应该有效: 如有任何问题,请告诉我:)
public LocalDate mostCommonDate() {
Map<LocalDate, Integer> map = new HashMap<>();
for (Newborn newborn : newborns) {
Integer value = map.get(newborn.getBirthday());
map.put(newborn.getBirthday(), (value == null) ? 1 : value + 1);
}
Entry<LocalDate, Integer> max = null;
for (Entry<LocalDate, Integer> entry : map.entrySet()) {
if (max == null || max.getValue() > entry.getValue()) {
max = entry;
}
}
return max.getKey();
}