2011-03-04 11 views
11

Si tengo un conjunto que sé que contiene un solo elemento, ¿cuál es la mejor manera de extraerlo? Lo mejor que puedo llegar a decir esto, pero no se siente muy maravilloso: un montón¿Cuál es la mejor manera de extraer un valor único de un conjunto de groovy?

set = [1] as Set 
e = set.toList()[0] 
assert e == 1 

Si estoy tratando con una lista, que tengo de maneras agradables para obtener el elemento, ninguno de que parecen trabajar con conjuntos:

def list = [1] 
e = list[0] 
(e) = list 
e = list.head() 
+2

El 'groovy feel' es algo muy subjetivo. Si estuviera escribiendo el código, estaré contento con 'set.toList(). First()'. :-) –

Respuesta

15

algunas alternativas, ninguno de ellos muy bonita:

set.iterator()[0] 
set.find { true } 
set.collect { it }[0] 

Por último, si se garantiza que ese conjunto tiene un solo elemento:

def e 
set.each { e = it } 

El problema subyacente, por supuesto, es que los conjuntos de Java proporcionan ningún orden definido (como se menciona en the Javadoc), y por lo tanto sin capacidad para obtener el n-ésimo elemento (discutido in this question y this one). Por lo tanto, cualquier solución es siempre de alguna manera convertir el conjunto a una lista.

Supongo que cualquiera de las primeras dos opciones implica la menor copia de datos, ya que no necesitan construir una lista completa del conjunto, pero para un conjunto de un elemento, eso no debería ser una preocupación.

+1

Hay un método [Collection.find()] (http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#find()) desde 1.8. 1, que es un poco más corto de usar que 'set.find {true}' –

18

Otra posibilidad (que trabajará en Java o Groovy):

set.iterator().next() 
+0

Agradable y limpio. – Vincent

0

Desde Java 8, aquí es otra solución que funcione para Java y Groovy:

set.stream().findFirst().get() 
1

Incluso cuando esta pregunta es bastante antigua, estoy compartiendo mi solución un poco más bonita.

(set as List).first() 
(set as List)[0] 

Si es necesario tomar en cuenta nula (no es el caso en esta pregunta):

(set as List)?.first() 
(set as List)?.get(index) 

espero que ayude! :)

Cuestiones relacionadas