Tengo una lista de objetos y la lista es muy grande. El objeto es
class Sample {
String value1;
String value2;
String value3;
String value4;
String value5;
}
Ahora tengo que buscar un valor específico de un objeto en la lista. Digamos que si valor3=='tres'
tengo que devolver esos objetos (Mi búsqueda no siempre se basa en valor3)
La lista es
List<Sample> list = new ArrayList<Sample>();
¿Cuál es la forma eficiente de hacerlo?
Gracias.
Si siempre buscas en base a valor3
, podrías almacenar los objetos en un Mapa:
Map<String, List<Sample>> map = new HashMap <>();
A continuación, puede rellenar el mapa con key = value3
y value = lista de objetos de muestra con esa misma propiedad value3
.
A continuación, puede consultar el mapa:
List<Sample> allSamplesWhereValue3IsDog = map.get("Dog");
Nota: si no hay 2 instancias de Sample
que puedan tener el mismo value3
, puede utilizar simplemente un Map<String, Sample>
.
Modifico esta lista y añado una Lista a las muestras pruebe esto
Pseudocódigo
Sample {
List<String> values;
List<String> getList() {
return values}
}
for(Sample s : list) {
if(s.getString.getList.contains("three") {
return s;
}
}
Como tu lista es una ArrayList
, se puede asumir que no está ordenada. Por lo tanto, no hay manera de buscar su elemento que es más rápido que O(n).
Si puedes, deberías pensar en cambiar tu lista por un Set
(con HashSet
como implementación) con un Comparator
específico para tu clase de ejemplo.
Otra posibilidad sería utilizar un HashMap
. Puedes añadir tus datos como Sample
(por favor, empieza los nombres de las clases con mayúscula) y utilizar la cadena que quieres buscar como clave. A continuación, sólo tiene que utilizar
Sample samp = myMap.get(myKey);
Si puede haber múltiples muestras por clave, use Map<String, List<Sample>>
, de lo contrario use Map<String, Sample>
. Si utiliza varias claves, tendrá que crear varios mapas que contengan el mismo conjunto de datos. Como todos apuntan a los mismos objetos, el espacio no debería ser un gran problema.