Разделение студентов на группы на основе равных медиан в JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Разделение студентов на группы на основе равных медиан в Java

Сообщение Anonymous »

Я работаю над программой на Java, в которой у меня есть класс ClassGenerator, который управляет оценками учащихся с течением времени и должен разделить их на группы на основе равных медиан. Вот упрощенная версия того, чего я пытаюсь достичь:
У меня есть ученики с оценками за три года, хранящиеся в таких массивах:

Код: Выделить всё

int[] students = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double[][] marksOverTime = {
{80, 85, 90},
{70, 75, 80},
{60, 65, 70},
{50, 55, 60},
{40, 45, 50},
{30, 35, 40},
{20, 25, 30},
{10, 15, 20},
{0, 5, 10},
{}
};
Мне нужно реализовать метод равныхMediansGroups() в ClassGenerator, который делит учащихся на группы numGroups на основе их прошлогодних оценок, гарантируя, что каждая группа имеет примерно равные медианы.
Вот что у меня есть, но это не дает правильных результатов:

Код: Выделить всё

public List equalMediansGroups() {
int[] studentsWithMarks = getStudentsWithMarks();
Arrays.sort(studentsWithMarks, Comparator.comparingDouble(this::getLastMark).reversed());

int groupSize = studentsWithMarks.length / numGroups;
int remainder = studentsWithMarks.length % numGroups;

List groups = new ArrayList();

int index = 0;
for (int i = 0; i < numGroups; i++) {
int start = index;
int end = start + groupSize + (i < remainder ? 1 : 0);

double median;
if ((end - start) % 2 == 0) {
median = (getLastMark(studentsWithMarks[end - 1]) + getLastMark(studentsWithMarks[start])) / 2.0;
} else {
median = getLastMark(studentsWithMarks[(start + end) / 2]);
}

double[] group = new double[end - start + 1];
group[0] = median;

for (int j = start; j < end; j++) {
group[j - start + 1] = studentsWithMarks[j];
}
groups.add(group);
index = end;
}
return groups;
}

public static void main(String[] args) {
int[] students = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double[][] marksOverTime = {
{80, 85, 90},
{70, 75, 80},
{60, 65, 70},
{50, 55, 60},
{40, 45, 50},
{30, 35, 40},
{20, 25, 30},
{10, 15, 20},
{0, 5, 10},
{}
};

ClassGenerator classGenerator = new ClassGenerator(students, marksOverTime, 3);
List groups = classGenerator.equalMediansGroups();

// Print groups
for (double[] group : groups) {
System.out.println("Group median: " + group[0]);
System.out.println("Group students: " + Arrays.toString(Arrays.copyOfRange(group, 1, group.length)));
System.out.println();
}
}
Результат, который я сейчас получаю, неудовлетворительный:

Код: Выделить всё

Group median: 20.0
Group students: [9.0, 8.0, 7.0]

Group median: 50.0
Group students: [6.0, 5.0, 4.0]

Group median: 80.0
Group students: [3.0, 2.0, 1.0]
Может кто-нибудь помочь мне понять, какие корректировки необходимы в моем методеqualMediansGroups() для достижения правильной группировки на основе равных медиан оценок учащихся с течением времени?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... ns-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»