如何创建以属性为键、以最大值为值的映射
How to create a map with an attribute as a key and a maximum value as a value
所以,在大学里,我们正在处理 csv 文件和流。现在我正在做一些家庭作业,但我已经坚持这个练习好几天了。我有一个 csv 文件,其中包含一些有关事故的数据(如事故严重程度、受害者人数等),我有一个函数可以读取该数据并将其转换为事故 object 列表(其中有一个属性 对于 csv 具有的每种数据类型):
private Severity severity;
private Integer victims;
public Accident(Severity severity, Integer victims) {
this.severity = severity;
this.victims = victims;
}
我已将该列表保存在 object 中,我可以使用 getAccidents()
:
调用该列表
private List<Accident> accidents;
public AccidentArchive(List<Accident> accidents) {
this.accidents = accidents;
public Map<Severity, Integer> getMaxVictimsPerSeverity() { //Not working correctly
return getAccidents().stream.collect(Collectors.toMap(Accident::getSeverity, Accident::getVictims, Integer::max));
现在,我必须创建一个函数来实现标题所说的功能。我认为地图键可能是严重程度(这是一个枚举值,轻微、严重和致命),值可能是具有相同严重程度的每起事故的最大受害者人数。例如,地图输出可能是:SLIGHT=1, SERIOUS=3, FATAL=5
。
我已经尝试使用 Collections、Collectors 和 Comparator 库,但我找不到任何方法来划分每个严重性值中的所有事故,获得每个事故的最大受害者人数,然后保存两者Map<Severity, Integer>
地图中的值。
该功能现在以这种方式启动:
public Map<Severity, Integer> getMaxVictimsPerSeverity() { return getAccidents().stream().collect(Collectors.toMap(Accident::getSeverity, ...))
然后我尝试了很多东西,但我找不到任何方法来 return 我想要的。我还是新手,很多东西还不明白所以请问我是否忘记了什么。
您正在尝试按严重程度分组并计算每组中的事故数。
Map<Severity, Long> counted = list.stream()
.collect(Collectors.groupingBy(Accident::getSeverity, Collectors.counting()));
这应该可以帮助您实现您的目标。
这是一个工作示例:
import java.util.*;
import java.util.stream.*;
public class Test {
public static void main(String args[]) {
Accident a1 = new Accident(Severity.SLIGHT);
Accident a2 = new Accident(Severity.SERIOUS);
Accident a3 = new Accident(Severity.SLIGHT);
Accident a4 = new Accident(Severity.FATAL);
Accident a5 = new Accident(Severity.FATAL);
List<Accident> list= new ArrayList<>();
list.add(a1);
list.add(a2);
list.add(a3);
list.add(a4);
list.add(a5);
Map<Severity, Long> counted = list.stream()
.collect(Collectors.groupingBy(Accident::getSeverity, Collectors.counting()));
System.out.println(counted);
}
static class Accident{
Severity severtity;
Accident(Severity s){
this.severtity = s;
}
public Severity getSeverity(){
return severtity;
}
}
static enum Severity{
SLIGHT, SERIOUS, FATAL;
}
}
结果:{FATAL=2, SLIGHT=2, SERIOUS=1}
提供一个值提取器来获取每次事故的受害者,并提供一个缩减器来保留最大数量的受害者。
return getAccidents().stream()
.collect(Collectors.toMap(Accident::getSeverity, Accident::getVictims, Integer::max));
所以,在大学里,我们正在处理 csv 文件和流。现在我正在做一些家庭作业,但我已经坚持这个练习好几天了。我有一个 csv 文件,其中包含一些有关事故的数据(如事故严重程度、受害者人数等),我有一个函数可以读取该数据并将其转换为事故 object 列表(其中有一个属性 对于 csv 具有的每种数据类型):
private Severity severity;
private Integer victims;
public Accident(Severity severity, Integer victims) {
this.severity = severity;
this.victims = victims;
}
我已将该列表保存在 object 中,我可以使用 getAccidents()
:
private List<Accident> accidents;
public AccidentArchive(List<Accident> accidents) {
this.accidents = accidents;
public Map<Severity, Integer> getMaxVictimsPerSeverity() { //Not working correctly
return getAccidents().stream.collect(Collectors.toMap(Accident::getSeverity, Accident::getVictims, Integer::max));
现在,我必须创建一个函数来实现标题所说的功能。我认为地图键可能是严重程度(这是一个枚举值,轻微、严重和致命),值可能是具有相同严重程度的每起事故的最大受害者人数。例如,地图输出可能是:SLIGHT=1, SERIOUS=3, FATAL=5
。
我已经尝试使用 Collections、Collectors 和 Comparator 库,但我找不到任何方法来划分每个严重性值中的所有事故,获得每个事故的最大受害者人数,然后保存两者Map<Severity, Integer>
地图中的值。
该功能现在以这种方式启动:
public Map<Severity, Integer> getMaxVictimsPerSeverity() { return getAccidents().stream().collect(Collectors.toMap(Accident::getSeverity, ...))
然后我尝试了很多东西,但我找不到任何方法来 return 我想要的。我还是新手,很多东西还不明白所以请问我是否忘记了什么。
您正在尝试按严重程度分组并计算每组中的事故数。
Map<Severity, Long> counted = list.stream()
.collect(Collectors.groupingBy(Accident::getSeverity, Collectors.counting()));
这应该可以帮助您实现您的目标。
这是一个工作示例:
import java.util.*;
import java.util.stream.*;
public class Test {
public static void main(String args[]) {
Accident a1 = new Accident(Severity.SLIGHT);
Accident a2 = new Accident(Severity.SERIOUS);
Accident a3 = new Accident(Severity.SLIGHT);
Accident a4 = new Accident(Severity.FATAL);
Accident a5 = new Accident(Severity.FATAL);
List<Accident> list= new ArrayList<>();
list.add(a1);
list.add(a2);
list.add(a3);
list.add(a4);
list.add(a5);
Map<Severity, Long> counted = list.stream()
.collect(Collectors.groupingBy(Accident::getSeverity, Collectors.counting()));
System.out.println(counted);
}
static class Accident{
Severity severtity;
Accident(Severity s){
this.severtity = s;
}
public Severity getSeverity(){
return severtity;
}
}
static enum Severity{
SLIGHT, SERIOUS, FATAL;
}
}
结果:{FATAL=2, SLIGHT=2, SERIOUS=1}
提供一个值提取器来获取每次事故的受害者,并提供一个缩减器来保留最大数量的受害者。
return getAccidents().stream()
.collect(Collectors.toMap(Accident::getSeverity, Accident::getVictims, Integer::max));