访问arraylist的arraylist的arraylist的元素?

Posted

技术标签:

【中文标题】访问arraylist的arraylist的arraylist的元素?【英文标题】:Access elements of arraylist of arraylist of arraylist? 【发布时间】:2018-11-11 10:55:59 【问题描述】:

我是 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:

    public class Clas-s-room
    
      private String clas-s-room;
      private ArrayList<Student> listOfStudents;

     public Clas-s-room (String clas-s-room)
     
      this.clas-s-room = clas-s-room;
      listOfStudents = new ArrayList<Student>();
     
   

并且这个类包括添加学生对象的方法,列出类中的所有学生(listAllStudentsInClas-s-room),它返回一个学生的ArrayList,找到类中成绩最高的学生(getHighestGradeStudent),以及一个列表成绩高于一定数量的学生。 最后是类School,是Clas-s-room的ArrayList:

public class School

 private ArrayList<Clas-s-room> school;

 public School()
 
  school = new ArrayList<Clas-s-room>();
  

这包括添加类对象的方法,它应该包括返回具有最高成绩的学生的方法,以及所有成绩高于某个班级的学生列表。但是,我只能通过添加的第一个类来迭代方法!这是到目前为止 getHighestGradeStudentEver 的代码:

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

这仅返回从添加到学校的第一个教室对象中成绩最高的学生。我究竟做错了什么?抱歉问题太长了,我尽量说清楚!

【问题讨论】:

必须更改的一件事是名为Class的类...重命名它!该代码甚至可以使用变量class 编译吗?也许更好的名字是StandardGradeDivision 在编写代码时请不要使用Java关键字作为变量名 完成,很抱歉造成混乱。希望现在好多了。 我知道,但是可以用什么来代替 get(0)?它需要是一个 int 索引,不是吗? 如果您已经拥有getHighestGradeStudent,它将返回每所学校的最高成绩。然后,您需要做的就是比较这些学生的列表跨学校列表。因此,遍历学校列表并比较他们的highestGradeStudent 以找到所有学生中最高的... 比较这些学生的列表 需要Comparator&lt;Student&gt; 根据他们的finalGrade 说出哪一个成绩更高。 【参考方案1】:

如果您已经可以在一个班级中获得最高分的学生,那么您可以在所有班级中获得最高分,然后从所有班级中找出最高分。

// find the highest grade in each class
ArrayList<Student> highestInEachClass = new ArrayList<>();
for (Clas-s-room clas-s-room : school) 
    highestInEachClass.add(clas-s-room.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);

【讨论】:

【参考方案2】:

据我了解您的问题,您已经有一个函数Clas-s-room.getHighestGradeStudent(),它可以为您提供该班最好的学生。您还可以获取给定学生的成绩,因为 Student 对象包含 .finalGrade

您想遍历学校的所有教室,并找到成绩最高的学生。

所以你有你的 for 循环,它在教室中迭代。对于每个教室,您都会获得一些学生的期末成绩:

int highestGrade = school.get(i).listAllStudentsInClas-s-room().get(i).getFinalGrade();
                                                                  ^

这可能不是您想要的。相反,您想要该教室中最好的学生成绩。为此,您应该改用

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

(如果我的假设是错误的,并且您没有给定教室的函数getHighestGradeStudent(),则需要循环遍历listAllStudentsInClas-s-room() 的结果(或将该列表排序存储))

然后,如果当前教室的最佳学生比您之前在s 中的最佳学生更好,您可以通过更新存储的最佳学生s 来继续您的代码。 但请确保您使用highestGradehighestValue,而不是两者。就您的代码而言,我没有看到任何地方定义了 highestValue


请注意,如果您只搜索给定班级中最好的学生一次,则可以使这段代码更高效。我会做的

Student bestOfClas-s-room = school.get(i).getHighestGradeStudent();
int highestGrade = bestOfClas-s-room.getFinalGrade();

因此,您只需执行 s = bestOfClas-s-room 即可将您的学生存储在 s 中,而不是再次搜索整个列表。 但这是一种优化,不应该与您的程序的正确性相关。

【讨论】:

以上是关于访问arraylist的arraylist的arraylist的元素?的主要内容,如果未能解决你的问题,请参考以下文章

Java容器:ArrayList的神秘面纱

Java容器:ArrayList的神秘面纱

Java中ArrayList的使用

list 接口与实现类arraylist 区别

ArrayList详解

ArrayList详解