распределять людей по группам равномерно на основе пользовательских данных - PullRequest
0 голосов
/ 27 апреля 2020
ReadFile randomGenerate = new ReadFile();
        Input userNum = new Input();
        String classnum = userNum.fileToSelect();
        int lineNumber = randomGenerate.lineCounter(classnum);

        //number of students in classnum.txt

        ArrayList<String> people = randomGenerate.readPeople();
        //a string of names(first word on each row)

        int userPut = userNum.numInput();
        int maxNum = lineNumber/userPut;

Правильно нет, я читаю текстовый файл - первое слово в каждой строке, которое является именем человека. Я хочу распределить этот ArrayList людей по четным группам с количеством групп, основанным на пользовательском вводе.

int[] numbers = RandomNumbersWithoutRepetition(0, lineNumber, lineNumber);       
//an array of numbers IN ORDER

int[] randomNumbers = RandomizeArray(numbers);
//shuffles the array

Я сгенерировал набор чисел по порядку, а затем перемешал их, что отлично работает.

Но мой метод группировки людей был основан на условиях, которые не очень хорошо работают. Так есть ли эффективный способ поместить этот ArrayList имен в нужные пользователю группы?

1 Ответ

1 голос
/ 27 апреля 2020

У меня x количество студентов.

У меня n количество групп.

Я предполагаю, что нет других критериев для разделения студентов на группы.

По сути, вы делите количество групп на количество студентов. Да, вы должны иметь дело с остатком. Но это просто.

Вот результаты теста. Я создал 53 студента и перетасовал их. Затем я разделил студентов на 4 группы. Я вручную отформатировал вывод, чтобы соответствовать ответу. В группе 1 учатся 14 человек, а в остальных - 13 человек.

Students: 42, 27, 5, 26, 32, 30, 44, 10, 17, 29, 40, 52, 
    47, 38, 49, 18, 46, 24, 34, 12, 13, 53, 35, 20, 1, 
    2, 41, 23, 43, 28, 8, 11, 50, 37, 9, 7, 48, 3, 33, 
    25, 31, 15, 22, 21, 14, 45, 36, 16, 51, 19, 4, 6, 39
Group 1: 42, 27, 5, 26, 32, 30, 44, 10, 17, 29, 40, 52, 47, 38
Group 2: 49, 18, 46, 24, 34, 12, 13, 53, 35, 20, 1, 2, 41
Group 3: 23, 43, 28, 8, 11, 50, 37, 9, 7, 48, 3, 33, 25
Group 4: 31, 15, 22, 21, 14, 45, 36, 16, 51, 19, 4, 6, 39

И вот код. Методы groupStudents и sortStudents являются методами, которые выполняют работу.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class StudentGroups {

    public static void main(String[] args) {
        int numberOfGroups = 4;
        int numberOfStudents = 53;
        StudentGroups sg = new StudentGroups(numberOfStudents);
        sg.printStudents();
        List<List<Integer>> groups = sg.groupStudents(
                numberOfGroups);
        sg.printGroups(groups);
    }

    private List<Integer> students;

    public StudentGroups(int numberOfStudents) {
        students = new ArrayList<>(numberOfStudents);
        for (int i = 0; i < numberOfStudents; i++) {
            students.add(i + 1);
        }
        Collections.shuffle(students);
    }

    public void printStudents() {
        System.out.print("Students: ");
        for (int i = 0; i < students.size(); i++) {
            System.out.print(students.get(i));
            if (i < (students.size() - 1)) {
                System.out.print(", ");
            }
        }
        System.out.println();
    }

    public List<List<Integer>> groupStudents(int groups) {
        List<List<Integer>> output = new ArrayList<>();

        int size = students.size();
        int group = size / groups;
        int remainder = size % groups;
        sortStudents(output, size, group, remainder);

        return output;
    }

    private void sortStudents(List<List<Integer>> output, 
            int size, int group, int remainder) {
        List<Integer> list = new ArrayList<>();
        int count = 0;

        for (int i = 0; i < size; i++) {            
            list.add(students.get(i));

            if (count == 0 && remainder > 0) {
                if (group > 0) {
                    list.add(students.get(++i));
                }
                remainder--;
            }

            if (++count >= group) {
                addList(output, list);
                list = new ArrayList<>();
                count = 0;
            }
        }

        addList(output, list);
    }

    private void addList(List<List<Integer>> output, 
            List<Integer> list) {
        if (list.size() > 0) {
            output.add(list);
        }
    }

    public void printGroups(List<List<Integer>> groups) {
        for (int j = 0; j < groups.size(); j++) {
            System.out.print("Group ");
            System.out.print(j + 1);
            System.out.print(": ");
            List<Integer> students = groups.get(j);
            for (int i = 0; i < students.size(); i++) {
                System.out.print(students.get(i));
                if (i < (students.size() - 1)) {
                    System.out.print(", ");
                }
            }
            System.out.println();
        }
    }

}
...