某班级有两个选修课程:A课程和B课程。张三、李四等人选修了A课程;李四、王五等人选修了B课程。编写一个Java应用程序(要求使用集合类),输出选修A课程的学生名单、选修B课程的学生名单、以及同时选修了A课程和B课程的学生名单。
时间: 2024-12-16 12:21:22 浏览: 15
在Java中,我们可以使用集合框架如`java.util.Set`和`java.util.HashSet`来表示每个学生的选择,并使用`intersection()`方法找出同时选择两个课程的学生。假设我们有一个名为`Student`的类,它包含姓名和选修课程的属性。
```java
import java.util.*;
class Student {
String name;
Set<String> courses; // 使用HashSet存储课程
// 构造函数,添加初始课程
public Student(String name) {
this.name = name;
this.courses = new HashSet<>();
}
// 添加课程
void selectCourse(String course) {
courses.add(course);
}
}
public class CourseSelection {
public static void main(String[] args) {
// 创建学生对象
Student zhangSan = new Student("张三");
zhangSan.selectCourse("A");
Student liSi = new Student("李四");
liSi.selectCourse("A"); // 选修A
liSi.selectCourse("B"); // 选修B
Student wangWu = new Student("王五");
wangWu.selectCourse("B");
// 存储所有学生
List<Student> students = Arrays.asList(zhangSan, liSi, wangWu);
// 学生分组
Map<String, Set<Student>> courseGroups = new HashMap<>();
for (Student student : students) {
if (!courseGroups.containsKey(student.courses)) {
courseGroups.put(student.courses, new HashSet<>());
}
courseGroups.get(student.courses).add(student);
}
// 输出选修A的、B的和两者都选的名单
System.out.println("选修A课程的学生名单:");
for (Set<Student> group : courseGroups.values()) {
if ("A".equals(group.iterator().next().courses)) {
System.out.println(group.stream().map(Student::getName).collect(Collectors.joining(", ")));
}
}
System.out.println("\n选修B课程的学生名单:");
for (Set<Student> group : courseGroups.values()) {
if ("B".equals(group.iterator().next().courses)) {
System.out.println(group.stream().map(Student::getName).collect(Collectors.joining(", ")));
}
}
System.out.println("\n同时选修A和B课程的学生名单:");
Set<Student> bothCourses = courseGroups.getOrDefault(new HashSet<>(Arrays.asList("A", "B")), Collections.emptySet());
System.out.println(bothCourses.stream().map(Student::getName).collect(Collectors.joining(", ")));
}
}
```
运行这个程序会输出每个名单。注意,这里假设"同时选修A和B课程"意味着学生选择了"A"和"B"这两个课程。如果需要更精确地匹配,可以检查每个学生的课程集合是否真的包含了A和B两个元素。
阅读全文