1

我有 2 个课程:学生和注册表。注册表旨在保存学生列表。当我尝试从注册表类返回学生的值时,迭代器移动到下一个学生以获取下一个值,因此当只有 2 个学生在场时,我得到一个 NoSuchElemennt 异常。

public String format() 
{
    ListIterator<Student> iterator 
            = studentList.listIterator();

    for (int i = 0; i < studentList.size(); i++)
    {
        System.out.println("if Statement");
        if (iterator.hasNext())
        {
            System.out.println("hasNext");
            return String.format("%0s%0s%0s", 
            iterator.next().getSurName(), iterator.next().getForeName(),
            iterator.next().getStudentId());
        }

    }        

    return null;
}

我希望它从 stud1 返回所有 3 个值,然后转到 stud2 等等。

这是学生和注册表源文件的链接以及两者的测试器; https://www.dropbox.com/sh/ol2jyfbuyyjnrcg/1J4LlEaqc6

如果需要,我会发布更多代码。

由于答案已关闭,因此不再删除​​任何代码和链接中的文件。

4

3 回答 3

2

每次调用时,您都在推进迭代器.next()。在当前迭代中只调用一次

像这样:

Student res = iterator.next();
return String.format("%0s%0s%0s", res.getSurName(),res.getForeName(),res.getStudentId());
于 2013-04-18T14:28:55.833 回答
1

您应该next只调用一次该方法,因为每次调用都会转发光标。

if (iterator.hasNext()) {
    Student currStudent = iterator.next();
    //use currStudent instead of calling next

我希望它从 stud1 返回所有 3 个值,然后转到 stud2 等等。

由于您的迭代器是该方法的本地迭代器,因此一旦方法返回,它将消失。我认为最好使您的format方法成为static(实用程序)方法并将其签名更改为将 anStudent作为参数。public static String format(Student student). 这样,您可以在遍历列表时格式化所有学生。

更新


您可以编写一个实用程序方法,如下所示:

public static String format(Student student) {
    return String.format("%0s%0s%0s", student.getSurName(), student.getForeName(), student.getStudentId());
}

对于可以格式化所有学生并返回格式的方法 -

public List<String> formatAll() {
    ListIterator<Student> iterator 
            = studentList.listIterator();
    List<String> formats = new ArrayList<String>();//to keep formats of all students
    //for (int i = 0; i < studentList.size(); i++)
    //{
        //System.out.println("if Statement");
        while (iterator.hasNext()) //while loop is better for iterators
        {
            Student currStudent = iterator.next();
            formats.add(format(student)); //calling utility method here
        }

    //}        

    return formats; // finally return the list of formats
}
于 2013-04-18T14:27:06.580 回答
1

要在不使用迭代器的情况下迭代列表,您应该使用增强型 for 循环。然后你的代码变成 -

public String format() 
{
ListIterator<Student> iterator 
        = studentList.listIterator();

for (Student student: studentList)
{
    System.out.println("For Loop");       

        return String.format("%s%s%s", 
        student.getSurName(), student.getForeName(),
        student.getStudentId());     

}   
 return null;   
}
于 2013-04-18T14:41:23.353 回答