Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用instanceof和迭代器_Java_Iterator_Polymorphism_Instanceof - Fatal编程技术网

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的写入速度更快,性能相同。