我将如何从这段代码中获取返回值?
它不允许我在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

如果StudentstudentNumber之外还可以有另一个数字,即SSN,则每当提及它时,我们都应该更精确地了解数字。在这种情况下,getStudentByNumber应该重命名为getStudentByStudentNumber,而number应该重命名为studentNumber。如果studentNumberStudent唯一的数字,则应将其重命名为number,因为在这种情况下Student.studentNumber将是多余的,即Student.getStudentNumber()应重命名为Student.getNumber()

类型应始终与要求一样具体,但不再具体。换句话说:类型应尽可能通用。如果您的方法采用ArrayList,则仅适用于ArrayList。如果您的方法采用List,则它将采用所有类型的列表,例如ArrayListLinkedList。如果您的方法采用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);
}

10-06 14:17