Доступ к элементам arraylist arraylist arraylist? - PullRequest
0 голосов
/ 11 ноября 2018

Я новичок в Java, и в настоящее время я использую BlueJ для проекта. У меня проблемы с доступом к объектам внутри ArrayList ArrayList таких объектов. Скажем, у меня есть объект Student:

public class Student
{
 private String homeAddress;
 private String monthBorn;
 private String yearBorn;
 private int;

 public Student(String homeAddress, String monthBorn, String yearBorn,  
 int finalGrade)
 {
   this.homeAddress = homeAddress;
   this.monthBorn = monthBorn;
   this.yearBorn = yearBorn;
   this.finalGrade = finalGrade;
  }
}

А затем методы, чтобы получить адрес, месяц, год и класс. Затем у меня есть класс Class, который представляет собой объект ArralyList of Student:

    public class Classroom
    {
      private String classroom;
      private ArrayList<Student> listOfStudents;

     public Classroom (String classroom)
     {
      this.classroom = classroom;
      listOfStudents = new ArrayList<Student>();
     }
   }

И этот класс включает методы для добавления объектов Student, для перечисления всех учащихся в классе (listAllStudentsInClassroom), который возвращает ArrayList of Student, для поиска ученика с наивысшей оценкой в ​​классе (getHighestGradeStudent) и в список. студентов с оценками выше определенной суммы. Наконец, класс School, который является ArrayList of Classroom:

public class School
{
 private ArrayList<Classroom> school;

 public School()
 {
  school = new ArrayList<Classroom>();
  }
}

Это включает в себя методы добавления объекта класса, и оно должно включать методы для возврата учащегося с самой высокой оценкой за все время и список учащихся всех классов с оценками выше определенного. Тем не менее, я могу получить только методы для перебора только первого добавленного класса! Вот код для getHighestGradeStudentEver до сих пор:

    public Student getHighestGradeStudentEver ()
    {
      Student s = school.get(0).getHighestGradeStudent();
      int highestGrade =   school.get(0).listAllStudentsInClassroom().get(0).getFinalGrade();
      for(int i =1; i< school.size(); i++){
        int highestGrade = school.get(i).listAllStudentsInClassroom().get(i).getFinalGrade();
       if(value > (highestValue)){
           highestValue = value;
           s = school.get(i).getHighestGradeStudent();
           }
         }
      return s;
     }

Возвращает только ученика с наивысшей оценкой из первого предмета в классе, добавленного в школу. Что я делаю неправильно? Извините за длинный вопрос, я старался быть максимально ясным!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Если вы уже можете получить ученика с самой высокой оценкой в ​​классе, вы можете получить его для всех классов и найти наивысшую оценку из всех.

// find the highest grade in each class
ArrayList<Student> highestInEachClass = new ArrayList<>();
for (Classroom classroom : school) {
    highestInEachClass.add(classroom.getHighestGradeStudent());
}

// find the highest grade overall
Student highestGradeStudent = highestInEachClass.get(0);
for (Student student : highestInEachClass) {
    if (highestGradeStudent.getFinalGrade() < student.getFinalGrade()) {
        highestGradeStudent = student;
    }
}
return highestGradeStudent;

В качестве альтернативы используйте Stream:

return school.stream().flatMap(x -> x.getListOfStudents().stream())
                      .sorted(Comparator.comparing(Student::getFinalGrade).reversed())
                      .findFirst().orElse(null);
0 голосов
/ 11 ноября 2018

Как я понимаю ваш вопрос, у вас уже есть функция Classroom.getHighestGradeStudent(), которая дает вам лучшего ученика этого класса. У вас также есть способ получить оценку данного студента, так как объект Student содержит .finalGrade.

Вы хотите пройтись по всем классным комнатам в школе и найти ученика с самой высокой оценкой.

Итак, у вас есть цикл for, который перебирает классы. И за каждый класс вы получаете произвольную итоговую оценку ученика:

int highestGrade = school.get(i).listAllStudentsInClassroom().get(i).getFinalGrade();
                                                                  ^

Это, вероятно, не то, что вы хотите. Вместо этого вы хотите получить лучшую оценку ученика из этого класса. Для этого вы должны вместо этого использовать

int highestGrade = school.get(i).getHighestGradeStudent().getFinalGrade();

(Если мое предположение неверно и у вас нет функции getHighestGradeStudent() данного класса, вам нужно будет зациклить результат listAllStudentsInClassroom() (или сохранить этот отсортированный список))

Затем вы можете продолжить работу со своим кодом, обновив сохраненную информацию о лучшем ученике s, если лучший ученик в текущем классе лучше, чем у вас ранее в s.
Но убедитесь, что вы используете highestGrade или highestValue, а не оба. Поскольку ваш код стоит, я не вижу highestValue, определенного где-либо.


Обратите внимание, что этот код можно сделать более эффективным, если вы будете искать лучшего ученика в данном классе один раз . Я бы сделал

Student bestOfClassroom = school.get(i).getHighestGradeStudent();
int highestGrade = bestOfClassroom.getFinalGrade();

так что у вас уже есть ученик для хранения в s, просто сделав s = bestOfClassroom вместо повторного поиска по всему списку.
Но это оптимизация, которая не должна относиться к Correctness вашей программы.

...