Como sugiere jeef3, el modelado de la verdad dominio en lugar de mantener sepa tasa, Listas implícitamente acopladas es el camino correcto a seguir ... cuando esta es una opción.
Existen varias razones por las que es posible que no pueda adoptar este enfoque. Si es así ...
A. Puede utilizar un enfoque de devolución de llamada, como lo sugiere el cletus.
B. Aún puede optar por exponer un iterador que expone el elemento de objeto de dominio para cada instancia compuesta. Este enfoque no te obliga a mantener una estructura de listas paralelas.
private List<String> _names = ...;
private List<Integer> _ages = ...;
Iterator<Person> allPeople() {
final Iterator<String> ni = _names.iterator();
final Iterator<Integer> ai = _ages.iterator();
return new Iterator() {
public boolean hasNext() {
return ni.hasNext();
}
public Person next() {
return new Person(ni.next(), ai.next());
}
public void remove() {
ni.remove();
ai.remove();
}
};
}
C. Puede usar una variación de esto y usar una API de cursor del estilo RowSet. Digamos que IPerson
es una interfaz que describe Persona. Entonces podemos hacer:
public interface IPerson {
String getName();
void setName(String name);
...
}
public interface ICursor<T> {
boolean next();
T current();
}
private static class PersonCursor implements IPerson, ICursor<IPerson> {
private final List<String> _names;
...
private int _index = -1;
PersonCursor(List<String> names, List<Integer> ages) {
_names = names;
...
}
public boolean next() {
return ++_index < _names.size();
}
public Person current() {
return this;
}
public String getName() {
return _names.get(_index);
}
public void setName(String name) {
_names.set(0, name);
}
...
}
private List<String> _names = ...;
private List<Integer> _ages = ...;
Cursor<Person> allPeople() {
return new PersonCursor(_names, _ages);
}
Tenga en cuenta que el enfoque B también ser hecho para apoyar cambios a la lista mediante la introducción de una interfaz de dominio, y tener el retorno iterador 'en vivo' los objetos.
posible duplicado de [Bes ¿Cómo puedo iterar en dos listas al mismo tiempo?] (http://stackoverflow.com/questions/3137944/best-way-to-iterate-over-thwo-lists-simultaneously) –
Esa pregunta es sutilmente diferente: se trata de cómo iterar _outside_ una clase sobre dos colecciones _inside_ una clase, lo que cambia un poco la interfaz. –