Мне удалось воспроизвести и запустить ваш код и получить ожидаемые результаты. Мне нужно было всего лишь внести несколько изменений:
1) В вашем начальном для l oop вы увеличиваете i на 4:
for (int i = 0; i < studentInfo.size(); i += 4) {
Я не знаю, почему вы это сделали, в результате чего вы пропускаете добавление учеников из вашего файла в список, поэтому я изменил его, увеличив значение i на 1:
for (int i = 0; i < studentInfo.size(); i++) {
2) Вызов Collections.shuffle () работает, как ожидалось, и при печати перемешанного список сразу после звонка вы получите что-то вроде и распечатав список, вы увидите, что они правильно перетасованы.
И, наконец, вам не следует звонить .sorted()
в вашей Lamda, которая снова упорядочит список, побеждая цель вызова Collections.shuffle()
:
Function<PeopleClass, String> discriminator = PeopleClass::getName;
AtomicInteger index = new AtomicInteger();
List<List<PeopleClass>> groups = new ArrayList<>(people.stream()
// .sorted(Comparator.comparing(discriminator))
.collect(Collectors.groupingBy(e -> (index.getAndIncrement() % numOfGroups)))
.values()
);
Наконец также полезно переопределить метод toString()
в вашем PersonClass
(было бы лучше просто вызвать его Person
). Переопределив toString()
, вы можете вернуть только имя человека, сделав распечатку всего Списка читабельной.
Ниже приведена последняя измененная версия ваших классов:
public String nMix(String file, int numOfGroups) {
ReadFile info = new ReadFile();
ArrayList<String> studentInfo = info.readEachWord(file);
List<PeopleClass> people = new ArrayList<PeopleClass>();
for (int i = 0; i < studentInfo.size(); i++) {
people.add(new PeopleClass(studentInfo.get(i))); //name
}
Collections.shuffle(people);
System.out.println("Shuffled people: " + people);
Function<PeopleClass, String> discriminator = PeopleClass::getName;
AtomicInteger index = new AtomicInteger();
List<List<PeopleClass>> groups = new ArrayList<>(people.stream()
//.sorted(Comparator.comparing(discriminator))
.collect(Collectors.groupingBy(e -> index.getAndIncrement() % numOfGroups))
.values());
//groups.forEach(System.out::println);
groups.forEach(System.out::println);
String txt = "";
for(int j = 0; j < groups.size(); j ++) {
txt += "Group" + (j + 1);
txt += "\r\n";
txt += groups.get(j);
txt += "\r\n";
txt += "\r\n";
}
return txt;
}
Человек Класс:
class PeopleClass {
String name;
public PeopleClass(String name) {
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public String toString() {
return this.name;
}
}
Входные данные: у меня нет содержимого вашего входного файла, поэтому используется пример списка: {"p1","p2","p3","p4","p5","p6","p7","p8","p9","p10"}
Выходные данные:
Перетасованные люди: [p8, p4, p7, p6, p9, p1, p3, p2, p5, p10]
Group1 [p8, p6, p3, p10]
Group2 [p4, p9, p2]
группа 3 [p7, p1, p5]