Сортировка списка объекта с помощью метода другого объекта

#java #list #sorting #stream

#java #Список #сортировка #поток

Вопрос:

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

 public class Student{
    public ArrayList<Student> students  = new ArrayList<Student>();
    public ArrayList<Course> studentCourses  = new ArrayList<Course>();
    //...
class Course{
    double score;
    
    public double getScore(){
        return this.score;
    }
    //...
}
  

Комментарии:

1. Да, ваш вопрос не показывает, что вы пробовали, и проблему с этим. Кроме того, почему List<Student> внутри класса Student?

2. спасибо за внимание, я действительно рад, если бы вы могли сказать мне, что я могу сделать вместо того, чтобы помещать List<Student> внутри класса, потому что мне нужно иметь полный список учеников, а также у меня есть другое поле со StudentsID для получения индекса элементов. я очень признателен, если вы укажете мне другую альтернативу. @user7

Ответ №1:

Ваш класс «Student» сбивает с толку. Судя по названию, звучит так, как будто этот класс должен представлять одного ученика. Но тогда у вас внутри него есть a List<Student> , что означает, что каждый Student объект будет содержать указатели на ноль или более других Student объектов. Что представляет эта связь? Почему студент ссылается на множество других студентов?

Ваш класс «Курс» также сбивает с толку, поскольку он содержит только оценку. Если бы я определял университетский курс, я бы предположил, что он будет представлять курс в школе / колледже / университете за определенный год, и для полноты он должен содержать следующую информацию:

  • название курса
  • год, в котором начинается курс
  • набор студентов, которые зарегистрировались для прохождения этого курса
  • тесты / экзамены / оценки, включенные в курс
  • общий балл или оценка, достигнутые каждым студентом в курсе

Если это домашнее задание, и вы делаете его простым, то вы, вероятно, можете игнорировать отдельные тесты / экзамены / оценки, а также год начала. Но вам все равно нужно будет решить, как сопоставить общий балл каждому ученику.

Предполагая, что вы создаете класс «Student», который представляет одного студента (и переименовываете свой класс базы данных student в «Students»), тогда вы можете просто создать Map<Student, Score> внутри своего класса «Course». (Вы можете использовать Map<Student, Integer> , если ваши оценки являются просто числовыми значениями.) Но обратите внимание, что если вы используете Student объекты в качестве Map ключей, вам нужно будет переопределить методы equals and hashcode в вашем классе «Student», чтобы они работали правильно. Лучший способ различать людей (у которых могут быть одинаковые имена, даты рождения и т. Д.) — Это присвоить каждому порядковый номер при регистрации. Таким образом, ваш класс «Student» может просто содержать long поле с серийным номером ID, а затем ваши equals hashcode методы and будут просто проверять и использовать это единственное уникальное значение.

В качестве альтернативы, вы можете предпочесть добавить карту в классе «Student», Map<Course, Score> чтобы каждый студент отслеживал свои оценки за курс. То, что вы выберете, будет зависеть от того, как ваше приложение чаще всего будет получать доступ к оценкам (получение оценок за курс для каждого учащегося или оценки учащихся за курс или и то, и другое).

Но общее сообщение заключается в том, что каждый создаваемый вами класс должен представлять что-то одно, и вам нужно точно решить, что именно. Затем вам нужно решить, какие поля нужны каждому классу, чтобы полностью представить эту вещь.