我将如何从这段代码中获取返回值?
它不允许我在FOR循环中使用return函数,而且我也不知道如何继续。
它应该返回一个存储在Array List al中的对象(在我的main方法中声明了该对象),但是我无法获得该方法来正确返回Student对象。
有小费吗?
public static Student getStudentByNumber(int number1, ArrayList<Student> al)
{
for(Iterator<Student> it = al.iterator(); it.hasNext();)
{
if(number1 == it.next().getStudentNumber())
{
return it.next();
}
else
{
return null;
}
}
}
最佳答案
问题不是return
内的for
,而是return
外没有for
。考虑一下al.isEmpty()
会发生什么。考虑一下您实际循环的频率。重新考虑return null
的位置。
考虑到第二次调用it.next()
可能不是您想要的-您是否真的返回了正确的元素?如果是最后一个匹配的学生怎么办?
注意名称。最好给变量起个关于它们的含义的含义。并保持一致。ArrayList
/ Collection
包含学生,因此应将其命名为:students
。
如果Student
除studentNumber
之外还可以有另一个数字,即SSN,则每当提及它时,我们都应该更精确地了解数字。在这种情况下,getStudentByNumber
应该重命名为getStudentByStudentNumber
,而number
应该重命名为studentNumber
。如果studentNumber
是Student
唯一的数字,则应将其重命名为number
,因为在这种情况下Student.studentNumber
将是多余的,即Student.getStudentNumber()
应重命名为Student.getNumber()
。
类型应始终与要求一样具体,但不再具体。换句话说:类型应尽可能通用。如果您的方法采用ArrayList
,则仅适用于ArrayList
。如果您的方法采用List
,则它将采用所有类型的列表,例如ArrayList
和LinkedList
。如果您的方法采用Collection
,则可以使用更多类型。而且没有理由为什么它只能与ArrayList
一起使用。所以类型实际上应该是Collection
。
但是无论如何,Java比这简单得多。您可以让Java为您完成工作,而不是显式使用Iterator
。
public static Student getStudentByNumber(int number, Collection<Student> students) {
for (Student student : students) {
if (student.getStudentNumber() == number) {
return student;
}
}
return null;
}
我会考虑交换参数的顺序。首先指定要搜索的位置,然后指定要搜索的内容,这样更符合逻辑/惯例:
public static Student getStudentByNumber(Collection<Student> students, int number) {
for (Student student : students) {
if (student.getStudentNumber() == number) {
return student;
}
}
return null;
}
使用Java中的函数式编程,它变得更加简单:
public static Student getStudentByNumber(Collection<Student> students, int number) {
return students.stream()
.filter(student -> student.getStudentNumber() == number)
.findFirst()
.orElse(null);
}