Java 将 instanceof 与迭代器一起使用
Java use instanceof with iterator
我有一个抽象 class Usuario
和一个 ArrayList<Usuario>
及其三个子 class 的对象。我现在想遍历 ArrayList
和 return 一个值,具体取决于对该对象使用 instanceof
的结果。
我得到一个错误:java.util.NoSuchElementException
。
我想这是因为迭代器是 Iterator
的对象而不是来自 Usuario
的任何子 classes。我对吗?有解决办法吗?
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;
}
您在迭代期间多次调用 itUsuarios.next
。
因此您可能会在 List
已经完全迭代时调用它,这将抛出 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()
returns 下一个项目并前进光标。这不是你想要的,所以试试这个:
Usuario usuario = itUsuarios.next();
...
if (usuario instanceof UsuarioBiblioteca) {
return 1;
} else if (usuario instanceof Bibliotecario) {
return 2;
} else if (usuario instanceof BibliotecaExterna) {
return 3;
}
使用您的代码考虑以下情况:listaUsuarios
仅包含两个 BibliotecaExterna
类型的元素。您对 next()
的第一次调用将 return 第一个元素,但由于类型不匹配,您发出对 next()
的第二次调用,其中 return 是第二个元素。同样,类型不匹配,因此您第三次调用 next()
(itUsuarios.next() instanceof BibliotecaExterna
) 但是 没有第三个元素 因此您将得到 NoSuchElementException
.
你的代码中存在一个巨大的误解:
如果您的当前元素是 BibliotecaExterna
的实例,它将在 first if 语句中调用 next()
并根据 UsuarioBiblioteca
.但是后来元素已经改变了。
而是存储在开头:
Usuario element = itUsuarios.next();
if(element instance of ...)
...
我有一个抽象 class Usuario
和一个 ArrayList<Usuario>
及其三个子 class 的对象。我现在想遍历 ArrayList
和 return 一个值,具体取决于对该对象使用 instanceof
的结果。
我得到一个错误:java.util.NoSuchElementException
。
我想这是因为迭代器是 Iterator
的对象而不是来自 Usuario
的任何子 classes。我对吗?有解决办法吗?
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;
}
您在迭代期间多次调用 itUsuarios.next
。
因此您可能会在 List
已经完全迭代时调用它,这将抛出 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()
returns 下一个项目并前进光标。这不是你想要的,所以试试这个:
Usuario usuario = itUsuarios.next();
...
if (usuario instanceof UsuarioBiblioteca) {
return 1;
} else if (usuario instanceof Bibliotecario) {
return 2;
} else if (usuario instanceof BibliotecaExterna) {
return 3;
}
使用您的代码考虑以下情况:listaUsuarios
仅包含两个 BibliotecaExterna
类型的元素。您对 next()
的第一次调用将 return 第一个元素,但由于类型不匹配,您发出对 next()
的第二次调用,其中 return 是第二个元素。同样,类型不匹配,因此您第三次调用 next()
(itUsuarios.next() instanceof BibliotecaExterna
) 但是 没有第三个元素 因此您将得到 NoSuchElementException
.
你的代码中存在一个巨大的误解:
如果您的当前元素是 BibliotecaExterna
的实例,它将在 first if 语句中调用 next()
并根据 UsuarioBiblioteca
.但是后来元素已经改变了。
而是存储在开头:
Usuario element = itUsuarios.next();
if(element instance of ...)
...