我有2个班级:学生和注册表.Registry旨在保存学生列表。当我尝试从注册表类中返回学生的valuse时,迭代器移动到下一个学生以获得下一个值,因此当只有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 击>
如果请求,我会发布更多代码。
由于答案已关闭,因此不再删除任何代码和链接中的文件。
答案 0 :(得分:2)
每次调用.next()
时,您都在推进迭代器 。对于当前迭代,只需将其称为一次。
像这样:
Student res = iterator.next();
return String.format("%0s%0s%0s", res.getSurName(),res.getForeName(),res.getStudentId());
答案 1 :(得分:1)
您应该只调用next
方法一次,因为每次调用都会转发光标。
if (iterator.hasNext()) {
Student currStudent = iterator.next();
//use currStudent instead of calling next
我希望它从stud1返回所有3个值,然后转到stud2,依此类推。
由于你的迭代器是方法的本地迭代器,所以一旦方法返回它就会消失。我认为最好将format
方法设为static
(效用)方法,并更改其签名以将Student
作为参数。 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
}
答案 2 :(得分:1)
要在不使用迭代器的情况下遍历列表,您应该使用Enhanced 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;
}