¿Hay alguna forma mejor que sólo un bucle a través y comparar manualmente los dos campos para cada objeto y luego romper cuando se encuentran? Eso parece tan sucio, buscando una mejor manera.
Si su preocupación es la mantenibilidad que podría hacer lo Fabian Steeg sugieren (que es lo que haría) aunque probablemente no es el "más eficiente" (porque hay que ordenar la matriz primero y luego realizar el binario búsqueda) pero ciertamente la opción más limpia y mejor.
Si realmente le preocupa la eficiencia, puede crear una implementación de Lista personalizada que use el campo de su objeto como el hash y use un HashMap como almacenamiento. Pero probablemente esto sería demasiado.
Luego debe cambiar el lugar donde completa los datos de ArrayList a YourCustomList.
igual:
List list = new ArrayList();
fillFromSoap(list);
Para:
List list = new MyCustomSpecialList();
fillFromSoap(list);
La implementación sería algo como lo siguiente:
class MyCustomSpecialList extends AbstractList {
private Map<Integer, YourObject> internalMap;
public boolean add(YourObject o) {
internalMap.put(o.getThatFieldYouKnow(), o);
}
public boolean contains(YourObject o) {
return internalMap.containsKey(o.getThatFieldYouKnow());
}
}
Más o menos como un HashSet, la problema aquí está el HashSet confía en la buena implementación del método hashCode, que probablemente no tenga. En su lugar, utiliza como hash "ese campo que conoce", que es el que hace que un objeto sea igual al otro.
Por supuesto, la aplicación de una lista de la cantidad de cero más complicado que mi fragmento anterior, por eso digo que el Fabian Steeg sugerencia sería mejor y más fácil de implementar (aunque algo como esto sería más eficiente)
Díganos lo que hiciste al final
"HashSet.contains() tiene un tiempo de acceso constante, es decir, O (1)": ¿podría indicar una prueba? ¿No depende * en gran medida * de la función hash? Si no, ¿por qué no simplemente decir "rápido en la práctica"? De lo contrario, creo que está difundiendo información errónea (probablemente con las mejores intenciones, aunque :)) –
@Jonas Kölker: De la documentación: "Esta clase ofrece un rendimiento de tiempo constante para las operaciones básicas (agregar, eliminar, contener y tamaño), asumiendo que la función hash dispersa los elementos apropiadamente entre los cubos ". –
@Jonas, mientras que una implementación pobre de hashCode() dará lugar a tiempos de acceso lentos, cualquier texto de algoritmo (especialmente el texto CLR (S) en el que se crean muchas de las estructuras de datos de Colecciones - http://www.amazon.com/ Introducción-Algoritmos-Third-Thomas-Cormen/dp/0262033844 /) le dirá que las estructuras de datos basadas en hash son O (1) para la búsqueda. Es importante darse cuenta de que O (1) no denota la búsqueda en un solo paso, sino la búsqueda no relacionada con el tamaño de la estructura de datos. Por lo tanto, incluso con un pobre hashCode() s, el tiempo de búsqueda es O (1). Wim no está difundiendo ninguna información errónea, de hecho, es perfecto. – dimo414