一个教学单位有假设有n个学生选课,要求将学生进行分组,并进行小组展示,请按照要求分组并选出展示的主讲人
1)请将学生随机选择进行分组,每五个人一组,最后剩余不够五个自动归为一组。
2)对上面的分组随机进行选择1/5的小组;
3)从上面的选出的小组每个小组中随机选出一人作为主讲人。
import java.util.ArrayList;
import java.util.Collections;
public class GroupingAndPresenterSelection {
public static void main(String[] args) {
// 1. 准备学生姓名列表
ArrayList<String> names = new ArrayList<>();
names.add("张三");
names.add("李四");
names.add("王五");
names.add("赵六");
names.add("钱七");
names.add("孙八");
names.add("周九");
names.add("吴十");
names.add("郑十一");
names.add("冯十二");
names.add("陈十三");
// 2. 随机分组,每五个人一组
Collections.shuffle(names); // 先将姓名列表随机打乱
int groupNum = (int) Math.ceil((double) names.size() / 5); // 计算需要分成几组
ArrayList<ArrayList<String>> groups = new ArrayList<>(); // 用于存放分组结果的列表
for (int i = 0; i < groupNum; i++) {
groups.add(new ArrayList<>()); // 先添加空白的组
}
for (int i = 0; i < names.size(); i++) {
groups.get(i / 5).add(names.get(i)); // 将每个人依次加入到对应的组中
}
// 3. 随机选择 1/5 的小组
Collections.shuffle(groups);
int selectedGroupNum = (int) Math.ceil((double) groupNum / 5);
ArrayList<ArrayList<String>> selectedGroups = new ArrayList<>();
for (int i = 0; i < selectedGroupNum; i++) {
selectedGroups.add(groups.get(i)); // 将前面的 1/5 组加入到被选中的组列表中
}
// 4. 从被选中的小组中随机选择一个主讲人
ArrayList<String> presenters = new ArrayList<>();
for (ArrayList<String> group : selectedGroups) {
int randIndex = (int) (Math.random() * group.size());
presenters.add(group.get(randIndex)); // 将每个被选中的小组中随机选择一个主讲人加入到列表中
}
// 输出结果
System.out.println("分组结果:");
for (int i = 0; i < groups.size(); i++) {
System.out.printf("第 %d 组:%s\n", i + 1, groups.get(i));
}
System.out.println("\n被选中的小组:");
for (int i = 0; i < selectedGroups.size(); i++) {
System.out.printf("第 %d 组:%s\n", i + 1, selectedGroups.get(i));
}
System.out.println("\n主讲人列表:");
for (int i = 0; i < presenters.size(); i++) {
System.out.printf("第 %d 位:%s\n", i + 1, presenters.get(i));
}
}
}
以下是你所需的Java程序:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class StudentGrouping {
public static void main(String[] args) {
// 假设有n个学生选课,这里为了方便演示,设置了20个学生
int n = 20;
// 随机打乱学生顺序
List<Integer> students = new ArrayList<>();
for (int i = 1; i <= n; i++) {
students.add(i);
}
Collections.shuffle(students, new Random());
// 每五个人一组,最后剩余不够五个自动归为一组
int groupSize = 5;
int numOfGroups = (int) Math.ceil(n / (double) groupSize);
List<List<Integer>> groups = new ArrayList<>();
for (int i = 0; i < numOfGroups; i++) {
groups.add(new ArrayList<>());
}
for (int i = 0; i < n; i++) {
int groupIndex = i / groupSize;
groups.get(groupIndex).add(students.get(i));
}
// 对分好的组进行随机选择1/5的小组
int numToSelect = (int) Math.ceil(numOfGroups / 5.0);
List<Integer> selectedGroups = new ArrayList<>();
while (selectedGroups.size() < numToSelect) {
int randomIndex = new Random().nextInt(numOfGroups);
if (!selectedGroups.contains(randomIndex)) {
selectedGroups.add(randomIndex);
}
}
// 从每个被选择的小组中随机选出一人作为主讲人
System.out.println("分组结果如下:");
for (int i = 0; i < numOfGroups; i++) {
List<Integer> group = groups.get(i);
boolean isChosen = selectedGroups.contains(i);
if (isChosen) {
int speakerIndex = new Random().nextInt(group.size());
int speakerId = group.get(speakerIndex);
System.out.println("小组" + (i+1) + "(主讲人:" + speakerId + "):" + group);
} else {
System.out.println("小组" + (i+1) + ":" + group);
}
}
}
}
使用方法:
注意:该程序仅供参考,可能存在不足之处,需要根据实际情况进行修改和完善。
可以参考下
public class StudentTest {
public static void main(String[] args) {
System.out.println("请输入要初始化的学生数,要求输入大于0的整数");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
List<Student> studentList = initStudents(num);
System.out.println("当前初始化的所有学生信息为:");
for (Student student : studentList) {
System.out.println(student.toString());
}
System.out.println("-------------------------------------------------");
//按照每5个学生进行分组
//整除5则刚好为学生数除以5这么多组,如果余数不为0则需要加1组
int groupNum = num % 5 == 0 ? num / 5 : num / 5 + 1;
//分组后的结果使用二维数据保存
List<List<Student>> groupList = new ArrayList<>();
for (int i = 0; i < groupNum; i++) {
if (i == groupNum - 1) {
groupList.add(studentList.subList(i * 5, studentList.size()));
} else {
groupList.add(studentList.subList(i * 5, (i + 1) * 5));
}
}
System.out.println("当前分组信息为");
for (int i = 0; i < groupList.size(); i++) {
System.out.println(String.format("第%s组成员为:", i + 1));
for (Student student : groupList.get(i)) {
System.out.println(student.toString());
}
System.out.println("-------------------------------------------------");
}
//随机抽取1/5的组,看需要抽取多少组
int chooseNum = (groupList.size() % 5 == 0) ? (groupList.size() / 5 == 0) ? 1 : (groupList.size() / 5) : (groupList.size() / 5 + 1);
//已经选中的组无法再进行选择
List<Integer> choosenGroup = new ArrayList<>();
//选中的学生
List<Student> choosenStudents = new ArrayList<>();
Random random = new Random();
int i = 0;
for (int j = 0; j < chooseNum; j++) {
while (!choosenGroup.contains((i = random.nextInt(groupList.size())))) {
System.out.println("当前选中的组号为:" + (i + 1));
choosenGroup.add(i);
Student student = groupList.get(i).get(random.nextInt(groupList.get(i).size()));
System.out.println(String.format("当前选中的主讲人为: %s", student.toString()));
choosenStudents.add(student);
break;
}
}
}
//初始化num个学生
private static List<Student> initStudents(int num) {
List<Student> studentList = new ArrayList<>();
for (int i = 0; i < num; i++) {
Student student = new Student();
student.setName("张三" + (i + 1));
student.setsNo(i + 1);
studentList.add(student);
}
//对所有学生进行随机
Collections.shuffle(studentList);
return studentList;
}
//定义学生类
private static class Student {
private String name;
private int sNo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getsNo() {
return sNo;
}
public void setsNo(int sNo) {
this.sNo = sNo;
}
@Override
public String toString() {
return "Student{" +
"姓名='" + name + '\'' +
", 编号=" + sNo +
'}';
}
}
}