Java使用instanceof和迭代器
我有一个抽象类Java使用instanceof和迭代器,java,iterator,polymorphism,instanceof,Java,Iterator,Polymorphism,Instanceof,我有一个抽象类Usuario和一个ArrayList,其中包含三个子类的对象。现在我想遍历ArrayList,并根据对该对象使用instanceof的结果返回一个值 我得到一个错误:java.util.NoSuchElementException 我想这是因为迭代器是iterator的对象,而不是来自Usuario的任何子类。我说得对吗?有什么解决办法吗 public int comprobarDni(String dniAComprobar, ArrayList<Usuario>
Usuario
和一个ArrayList
,其中包含三个子类的对象。现在我想遍历ArrayList
,并根据对该对象使用instanceof
的结果返回一个值
我得到一个错误:java.util.NoSuchElementException
我想这是因为迭代器是iterator
的对象,而不是来自Usuario
的任何子类。我说得对吗?有什么解决办法吗
public int comprobarDni(String dniAComprobar, ArrayList<Usuario> listaUsuarios) {
Iterator<Usuario> itUsuarios = listaUsuarios.iterator();
while (itUsuarios.hasNext()) {
if (dniAComprobar.equals(itUsuarios.next().getDni())) {
if (itUsuarios.next() instanceof UsuarioBiblioteca) {
return 1;
} else if (itUsuarios.next() instanceof Bibliotecario) {
return 2;
} else if (itUsuarios.next() instanceof BibliotecaExterna) {
return 3;
}
}
}
return 0;
}
public int compobardni(字符串dniAComprobar,数组列表listaUsuarios){
迭代器itUsuarios=listaUsuarios.Iterator();
while(itUsuarios.hasNext()){
if(dniAComprobar.equals(itUsuarios.next().getDni()){
if(itUsuarios.next()UsuarioBiblioteca实例){
返回1;
}else if(itUsuarios.next()libraiotecario实例){
返回2;
}else if(itUsuarios.next()BibliotecaExterna实例){
返回3;
}
}
}
返回0;
}
您正在调用itUsuarios。接下来在迭代过程中多次调用
因此,您可能会在列表
已经被完全迭代时调用它,这将抛出java.util.NoSuchElementException
考虑分配一个Usuario
值一次,并参考该值:
while (itUsuarios.hasNext()) {
// reference this instead of itUsuarios.nex() for next references
Usuario usuario = itUsuarios.next();
或…
使用快速枚举以获得更清晰的代码:
for (Usuario usuario: listaUsuarios) {
...
您在迭代过程中多次调用iTusarios.next
因此,您可能会在列表
已经被完全迭代时调用它,这将抛出java.util.NoSuchElementException
考虑分配一个Usuario
值一次,并参考该值:
while (itUsuarios.hasNext()) {
// reference this instead of itUsuarios.nex() for next references
Usuario usuario = itUsuarios.next();
或…
使用快速枚举以获得更清晰的代码:
for (Usuario usuario: listaUsuarios) {
...
Iterator.next()
返回下一项并前进光标。这不是您想要的,请尝试以下方法:
Usuario usuario = itUsuarios.next();
...
if (usuario instanceof UsuarioBiblioteca) {
return 1;
} else if (usuario instanceof Bibliotecario) {
return 2;
} else if (usuario instanceof BibliotecaExterna) {
return 3;
}
用代码考虑以下情况:<代码> ListAuuRuiS只包含类型<代码> BiLogoTeCaseExtAux/Cudio>两个元素。您对next()
的第一次调用将返回第一个元素,但由于类型不匹配,因此您对next()
发出第二次调用,该调用将返回第二个元素。同样,类型不匹配,因此您对next()
(itUsuarios.libraiotecaexterna的next()实例)发出第三个调用,但没有第三个元素,因此您将获得NoSuchElementException
迭代器。next()
返回下一项并前进光标。这不是您想要的,请尝试以下方法:
Usuario usuario = itUsuarios.next();
...
if (usuario instanceof UsuarioBiblioteca) {
return 1;
} else if (usuario instanceof Bibliotecario) {
return 2;
} else if (usuario instanceof BibliotecaExterna) {
return 3;
}
用代码考虑以下情况:<代码> ListAuuRuiS只包含类型<代码> BiLogoTeCaseExtAux/Cudio>两个元素。您对next()
的第一次调用将返回第一个元素,但由于类型不匹配,因此您对next()
发出第二次调用,该调用将返回第二个元素。同样,类型不匹配,因此您对next()
(iTusarios.next()实例of BibliotecaExterna
)发出第三个调用,但没有第三个元素,因此您将得到NoTouchElementException
,代码中有一个巨大的误解:
如果当前元素是BibliotecaExterna
的实例,它将在firstIf语句中调用next()
,并对照UsuarioBiblioteca
检查它。但是元素已经改变了
而是在开始时存储它:
Usuario element = itUsuarios.next();
if(element instance of ...)
...
您的代码中存在一个巨大的误解:
如果当前元素是BibliotecaExterna
的实例,它将在firstIf语句中调用next()
,并对照UsuarioBiblioteca
检查它。但是元素已经改变了
而是在开始时存储它:
Usuario element = itUsuarios.next();
if(element instance of ...)
...
回答得很好,除了增强的for
循环不是“快速”之外。它执行完全相同的操作,即使用迭代器。它是更简单、更干净的代码,但不是更快的代码。更简单的是,它可能写得更快,但你的文本不是这样读的。@Andreas如果内存可用,“快速枚举”在这里只是“增强for循环”的同义词。不要求任何性能改进。事实上,这个成语实际上在幕后使用了迭代器。。。TL;DR写得更快,性能也一样。回答不错,除了增强的for
循环不是“快”之外。它执行完全相同的操作,即使用迭代器。它是更简单、更干净的代码,但不是更快的代码。更简单的是,它可能写得更快,但你的文本不是这样读的。@Andreas如果内存可用,“快速枚举”在这里只是“增强for循环”的同义词。不要求任何性能改进。事实上,这个成语实际上在幕后使用了迭代器。。。TL;DR的写入速度更快,性能相同。