访问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
编译吗?也许更好的名字是Standard
、Grade
或Division
。
在编写代码时请不要使用Java关键字作为变量名
完成,很抱歉造成混乱。希望现在好多了。
我知道,但是可以用什么来代替 get(0)?它需要是一个 int 索引,不是吗?
如果您已经拥有getHighestGradeStudent
,它将返回每所学校的最高成绩。然后,您需要做的就是比较这些学生的列表跨学校列表。因此,遍历学校列表并比较他们的highestGradeStudent 以找到所有学生中最高的... 比较这些学生的列表 需要Comparator<Student>
根据他们的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
来继续您的代码。
但请确保您使用highestGrade
或highestValue
,而不是两者。就您的代码而言,我没有看到任何地方定义了 highestValue
。
请注意,如果您只搜索给定班级中最好的学生一次,则可以使这段代码更高效。我会做的
Student bestOfClas-s-room = school.get(i).getHighestGradeStudent();
int highestGrade = bestOfClas-s-room.getFinalGrade();
因此,您只需执行 s = bestOfClas-s-room
即可将您的学生存储在 s
中,而不是再次搜索整个列表。
但这是一种优化,不应该与您的程序的正确性相关。
【讨论】:
以上是关于访问arraylist的arraylist的arraylist的元素?的主要内容,如果未能解决你的问题,请参考以下文章