new ejemplo java set any

ejemplo - text field java



Buena forma de obtener*any*value de un conjunto de Java? (3)

Como las transmisiones están presentes, puede hacerlo de esa manera también, pero debe usar la clase java.util.Optional . Optional es una clase contenedora para un elemento o explícitamente sin elemento (evitando el Nullpointer).

//returns an Optional. Optional <T> optT = set.stream().findAny(); //Optional.isPresent() yields false, if set was empty, avoiding NullpointerException if(optT.isPresent()){ //Optional.get() returns the actual element return optT.get(); }

Dado un simple Set<T> , ¿cuál es una buena forma (rápida, pocas líneas de código) para obtener algún valor del Set ?

Con una List , es fácil:

List<T> things = ...; return things.get(0);

Pero, con un Set , no hay .get(...) método .get(...) porque Set s no está ordenado.


Obtener cualquier elemento de un conjunto o colección puede parecer una demanda poco común, si no arbitraria o ecléctica, pero, es bastante común cuando uno, por ejemplo, necesita calcular estadísticas sobre objetos de claves o valores en un mapa y debe inicializar min / valores máximos . El elemento de un conjunto / colección (devuelto por Map.keySet () o Map.values ​​()) se utilizará para esta inicialización antes de actualizar los valores mínimos / máximos sobre cada elemento.

Entonces, ¿qué opciones uno tiene cuando se enfrenta con este problema y al mismo tiempo trata de mantener la memoria y el tiempo de ejecución pequeños y el código claro?

A menudo obtienes lo de siempre: " convierte Set en ArrayList y obtienes el primer elemento ". ¡Estupendo! Otra matriz de millones de elementos y ciclos de procesamiento adicionales para recuperar objetos de Conjunto, asignar matriz y poblarla :

HashMap<K,V> map; List<K> list = new ArrayList<V>(map.keySet()); // min/max of keys min = max = list.get(0).some_property(); // initialisation step for(i=list.size();i-->1;){ if( min > list.get(i).some_property() ){ ... } ... }

O uno puede usar el bucle con un iterador, usando un indicador para indicar que es necesario inicializar min / max y un enunciado condicional para verificar si ese indicador está establecido para todas las iteraciones en el ciclo. Esto implica una gran cantidad de verificación condicional.

boolean flag = true; Iterator it = map.keySet().iterator(); while( it.hasNext() ){ if( flag ){ // initialisation step min = max = it.next().some_property(); flag = false; } else { if( min > list.get(i).some_property() ){ min = list.get(i).some_property() } ... } }

O haga la inicialización fuera del ciclo:

HashMap<K,V> map; Iterator it = map.keySet().iterator(); K akey; if( it.hasNext() ){ // initialisation step: akey = it.next(); min = max = akey.value(); do { if( min > list.get(i).some_property() ){ min = akey.some_property() } } while( it.hasNext() && ((akey=it.next())!=null) ); }

¿Pero realmente vale la pena todo este manejo en nombre del programador (y configurar el iterador en nombre de la JVM) cada vez que se necesita mínimo / máximo?

La sugerencia de un viejo deporte correcto podría ser: "envuelve tu mapa en una clase que realiza un seguimiento de los valores mínimos y máximos cuando se coloca o elimina".

Hay otra situación que según mi experiencia surge la necesidad de cualquier elemento de un Mapa. Esto es cuando el mapa contiene objetos que tienen una propiedad común, todos iguales para todos ellos en ese mapa, y usted necesita leer esa propiedad . Por ejemplo, supongamos que hay un Mapa de contenedores del mismo histograma que tienen el mismo número de dimensiones. Dado un Mapa así, es posible que necesite conocer el número de dimensiones de cualquier Histobin en el Mapa para, por ejemplo, crear otra Histobin de las mismas dimensiones. ¿Debo configurar un iterador nuevamente y deshacerme de él después de llamar a next () solo una vez? Voy a omitir la sugerencia de la persona correcta para esta situación.

Y si todos los problemas para obtener cualquier elemento causa una memoria insignificante y aumentan los ciclos de la CPU, entonces ¿qué pasa con todo el código que uno tiene que escribir solo para obtener el elemento difícil de obtener?

Necesitamos el elemento any . ¡Dánoslo!


Un Set<T> es un Iterable<T> , por lo que iterar al primer elemento funciona:

Set<T> things = ...; return things.iterator().next();

Guava tiene un método para hacerlo, aunque es probable que el fragmento anterior sea ​​mejor .