当前位置: 首页 > 知识库问答 >
问题:

Java集合-按最大值分组、合并和删除

壤驷承
2023-03-14
public class Student {  
    String studentId;
    List<Subject> subjects;
    //+Getters, setters, constructors
}

public class Subject {  
    int subjectId;
    String grade;   
    int marks;
    //+Getters, setters, constructors
}
Student S1 subjects=[1, A, 90], [2, B, 80], [2, C, 70]
Student S1 subjects=[2, A+, 95], [3,C,70]
Student S2, subjects=[1, D, 50]
Student S2, subjects=[1, D, 50]
Student S1 subjects=[1, A, 90], [2, A+, 95], [3,C,70]  //Subject 2 is selected based on highest marks
Student S2, subjects=[1, D, 50] //Avoided duplicate for same mark
public List<Student> consolidate (List<Student> students)
    {
        List<Student> consolidatedStudents = new ArrayList<Student>();
        //???
        return consolidatedStudents;
    }

我怎样才能以最有效的方式做到这一点?

用于测试的主类示例

    public class Main {
    
    public static void main(String args[])
    {
        List<Subject> s1Subjects_1 = new ArrayList<>();
        List<Subject> s1Subjects_2 = new ArrayList<>();
        Subject s1Physics = new Subject(1,"A",90);
        Subject s1Chemistry_1 = new Subject(2,"B",80);      
        Subject s1Chemistry_2 = new Subject(2,"C",70);
        Subject s1Chemistry_3 = new Subject(2,"A+",95);
        Subject s1Biology = new Subject(3,"C",70);
        
        s1Subjects_1.add(s1Physics);
        s1Subjects_1.add(s1Chemistry_1);
        s1Subjects_1.add(s1Chemistry_2);
        s1Subjects_2.add(s1Chemistry_3);
        s1Subjects_2.add(s1Biology);
        
        List<Subject> s2Subjects_1 = new ArrayList<>();
        List<Subject> s2Subjects_2 = new ArrayList<>();
        Subject s2Physics_1 = new Subject(1,"D",50);
        Subject s2Physics_2 = new Subject(1,"D",50);
        s2Subjects_1.add(s2Physics_1);
        s2Subjects_2.add(s2Physics_2);
        
        Student s1_1 = new Student("s1", s1Subjects_1);
        Student s1_2 = new Student("s1", s1Subjects_2);
        Student s2_1 = new Student("s2", s2Subjects_1);
        Student s2_2 = new Student("s2", s2Subjects_2);
        
        List<Student> input = new ArrayList<>();
        input.add(s1_1);
        input.add(s1_2);
        input.add(s2_1);
        input.add(s1_2);        
        
        List<Student> output = consolidate(input);
    }
    
    public static List<Student> consolidate (List<Student> students)
    {
        List<Student> consolidatedStudents = new ArrayList<Student>();
        //
        //???
        //
        return consolidatedStudents;
    }

}

共有1个答案

姜建德
2023-03-14

这里有一个使用流的有趣方法…

这里,我使用collectors.tomap构建一个临时数据结构,将学生id映射到主题列表。我正在使用帮助器合并函数合并主题列表。

合并函数根据标记选择最佳主题。

public static List<Student> consolidate(List<Student> students) {
    Map<String, List<Subject>> map = students.stream()
            .collect(Collectors.toMap(Student::getStudentId,
                    Student::getSubjects,
                    (subjects1, subjects2) -> merge(subjects1, subjects2)));
    return map.entrySet()
            .stream()
            .map(e -> new Student(e.getKey(), e.getValue()))
            .collect(Collectors.toList());
}
private static List<Subject> merge(List<Subject> subjects1, List<Subject> subjects2) {
    Map<Integer, Subject> subjects1ById = new HashMap<>(subjectsMap(subjects1));
    Map<Integer, Subject> subjects2ById = subjectsMap(subjects2);
   
    subjects2ById.forEach((subId, sub) -> subjects1ById.merge(subId, sub,
            (sub1, sub2) -> pickBest(sub1, sub2)));
    return new ArrayList<>(subjects1ById.values());
}

private static Map<Integer, Subject> subjectsMap(List<Subject> subjects) {
    return subjects.stream()
            .collect(Collectors.toMap(Subject::getSubjectId, Function.identity(),
                    (sub1, sub2) -> pickBest(sub1, sub2)));
}

private static Subject pickBest(Subject s1, Subject s2) {
    return s1.getMarks() > s2.getMarks() ? s1 : s2;
}    
 类似资料:
  • 我有两个组合框。我正在填充这样的两个组合框。组合框1和2的名称是cmbpartyName和cmbprefPT2。 在这里,我从combox1中选择一个值,在它所选的索引更改事件中,如下所示。 由于两个组合框具有相同的值,如何从第二个组合框cmbPrefPT2中删除第一个组合框的选定值?

  • 以我的例子为例,有一个car对象,并发现基于模型(group by)的最小和最大价格值。 但我找不到哪些汽车物品有最大和最小的价格。我怎么能那样做?

  • 问题内容: 对于我的示例,拥有汽车对象,并根据模型(分组依据)发现了最小和最大价格值。 但是我找不到哪个汽车对象具有最高和最低价格。我怎样才能做到这一点? 问题答案: 如果您只对每个组感兴趣,则可以使用,例如 但是,由于您想要最昂贵和最便宜的产品,因此需要以下内容: 由于没有与之等效的通用统计对象,因此该解决方案带来了一些不便。如果这种情况不止一次发生,那么值得用这样的类填补空白: 将其添加到您的

  • 我有对象要按文档ID分组。分组后,我想获得它们的“最大值”。这就是我目前掌握的: 文档类: 重要的是,我已经实现了一个compareTo函数。我不确定在< code>groupingBy子句的< code>reducer参数中放什么。我也试过: 但无济于事。

  • 我有一个熊猫DataFrame看起来像这样: 我的目标是能够为每个项目计算每个日期之间的价值差异。例如,我想找到A项: 12(32-20,因为最大年份是2012年,最小年份是2010年)和B项:20 (40 - 20,因为最大年份是2019年,最小年份是2016年)。 我使用以下代码获取每个项目的年最大值和年最小值: 然后,我找到每个项目的年份最小值和年份最大值。然而,我坚持做我想要的。