关于#动归#的问题,如何解决?(语言-java)

一个教学单位有假设有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);
            }
        }
    }

}

使用方法:

  1. 打开任意Java开发环境,新建一个Java项目;
  2. 在src目录下新建一个类文件StudentGrouping.java;
  3. 将上述程序复制到该文件中;
  4. 运行程序,查看控制台输出的分组结果。

注意:该程序仅供参考,可能存在不足之处,需要根据实际情况进行修改和完善。

可以参考下


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 +
                    '}';
        }
    }

}