2011-03-04 14 views
11

Bildiğim bir Setim tek bir öğe içeriyorsa, ayıklamanın en iyi yolu nedir? Ben ile gelip en iyi bu, ama çok harika hissetmez: güzel yollarındanGroovy'deki bir Set'ten tek bir değer elde etmenin en iyi yolu nedir?

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

Bir liste uğraşıyorum, ben var bir sürü hiçbiri, eleman almak için hangi takımları ile çalışmıyor gibi görünüyor:

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

'Oruç hissi' çok öznel bir şeydir. Kodu yazıyorsam, set.toList(). First() 'dan mutlu olacağım. :-) –

cevap

15

birkaç alternatifleri çok güzel bunların hiçbiri:

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

Son olarak, bu seti yalnızca bir öğe olduğunu garanti eğer:

def e 
set.each { e = it } 

altında yatan sorun, tabii ki, bu nedenle inci elemanını (in this question ve this one ele alınan) almak için bir özelliği (the Javadoc belirtildiği gibi), Java takımları tanımlanmış bir düzen sağlar yani, ve. Bu nedenle, herhangi bir çözüm her zaman bir şekilde seti bir listeye dönüştürmek içindir.

Tahminimce, ilk iki seçeneğin herhangi biri, kümenin tam bir listesini oluşturmamaları gerektiğinden, en az veri kopyalamayı içermesidir, ancak tek öğeli bir dizi için, bu bir endişe kaynağı olmamalıdır.

+1

1.8'den beri [Collection.find()] (http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#find()) yöntemi var. 1, hangi set.find {true} ' –

18

Bir diğer olasılık (Java veya Groovy çalışacak olan):

Java 8, burada Java ve Groovy ikisi için çalışacak başka çözüm
set.iterator().next() 
+0

Güzel ve temiz kullanmaktan biraz daha kısadır. – Vincent

0

:

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

bile Bu soru oldukça eski, ben sadece biraz daha güzel bir çözüm paylaşıyorum.

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

(bu söz konusu değildir vaka) dikkate boş almak gerekiyorsa :

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

yardımcı olur Umut! :)

İlgili konular