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;
}
}
这里有一个使用流的有趣方法…
这里,我使用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年)。 我使用以下代码获取每个项目的年最大值和年最小值: 然后,我找到每个项目的年份最小值和年份最大值。然而,我坚持做我想要的。