如何创建以属性为键、以最大值为值的映射

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