按主题找到礼帽的最佳方法是什么?

时间:2017-05-16 17:43:09

标签: java collections

我有一个学生信息的字符串数组:

StudentNumber Integer, Subject String, mmarks integer

使用java&的最佳方法是什么?收集以找出每个主题的顶部。

ArrayList<String> strings = new ArrayList<String>();
strings.add("1 | Computers | 48");
strings.add("2 | Data Structures | 89");
strings.add("33 | English | 35");
strings.add("24 | Maths | 70");
strings.add("15 | Computers | 58");
strings.add("6 | Data Structures | 55");
strings.add("7 | English | 40");
strings.add("18 | Maths | 73");

for (String str : strings) {
    String [] strArray = str.split("\\|");
    // in completed code 
    for (int i = 0; i < str.length(); i++) {
        sam.put(strArray[0], strArray[2]);
        s.add(strArray[1]);
    }
}

预期输出

  

15台电脑
      2数据结构
      7英语
      18数学

1 个答案:

答案 0 :(得分:2)

创建一个Result类来存储信息:

class Result {
    private int studentNumber;
    private String subject;
    private int mark;

    // constructor, getters and setters go here ...
}

现在将您的List<String>转换为List<Result>

List<Result> results = new ArrayList<>();
for (String s : strings){
    String[] sa = s.split(" \\| ");
    results.add(new Result(Integer.parseInt(sa[0]), sa[1], Integer.parseInt(sa[2])));
}

results列表中创建一个按主题分组的流,然后找到标记最高的学生:

Map<String, Integer> map = results.stream()
        .collect(Collectors.groupingBy(Result::getSubject, 
                Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Result::getMark)), r -> r.get().getStudentNumber())));

打印结果:

map.forEach((k,v) -> System.out.println(v + " " + k));

15 Computers
18 Maths
7 English
2 Data Structures