如果我有一个课程数组列表,每个课程都有一个名称和学生数组,那么合并具有相同名称的所有课程的简单方法是什么,以便一个课程名称只在所有学生数组中出现一次?
就像这样:
ArrayList<Course> courses = {Course("math", {student1, student2}),
Course("art", {student3, student4}),
Course("math", {student5, student6})};
会变成这样:
ArrayList<Course> courses = {Course("math", {student1, student2, student5, student6}),
Course("art", {student3, student4})};
编辑:这里是课程和学生的班级,但我不认为他们应该太重要,我只是希望能够将学生的数组加在一起。
public class Course {
String name;
String[] students;
public Course(String name, String[] students) {
this.name = name;
this.students = students;
}
}
public class Student {
String name;
public Student(String name) {
this.name = name;
}
}
步骤如下:
-
创建HashMap <String,>courseNameToStudents
-
遍历输入课程元素。对于每个课程元素:
2 a。如果没有courseName键,添加(courseName, new List())到courseNameToStudents。"数学")
2 b。根据courseName键从courseNameToStudents获取值(学生列表)。将课程的所有学生添加到此列表
-
创建结果课程列表。浏览courseNameToStudents条目集。使用输入键作为课程名称,输入值作为学生创建新课程。将以这种方式创建的每个课程添加到result列表中。结果列表应该是您所期望的
祝你好运!
您可以为每个条目收集课程到Map<String, List<String>>
然后重新创建Course
对象:
Map<String, List<String>> map = new HashMap<>();
for (Course course : courses) {
var list = map.computeIfAbsent(course.name, k -> new ArrayList<String>());
list.addAll(Arrays.asList(course.students));
}
List<Course> coursesCombined = new ArrayList<>();
for (var entry : map.entrySet()) {
coursesCombined.add(
new Course(
entry.getKey(),
entry.getValue().toArray(new String[0])
)
);
}