2011-03-04 37 views
11

如果我有一個我知道包含單個元素的Set,那麼提取它的最佳方法是什麼?我能想出的最好的是這一點,但它並沒有覺得很常規:從常規集中提取單個值的最佳方式是什麼?

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

如果我對付列表,我有很多的不錯的方式來獲得元素,沒有這似乎與設置工作:

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

'常識的感覺'是一個非常主觀的東西。如果我正在編寫代碼,我會很滿意'set.toList()。first()'。 :-) – 2011-03-04 20:09:36

回答

15

幾個備選方案,他們沒有很漂亮:

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

最後,如果它保證該組只有一個項目:

def e 
set.each { e = it } 

根本的問題,當然,是Java集提供沒有定義順序(如在the Javadoc提到的),因此沒有得到第n個元素(討論in this questionthis one)的能力。因此,任何解決方案總是以某種方式將該集合轉換爲列表。

我的猜測是,前兩個選項中的任何一個都涉及最少的數據複製,因爲它們不需要構造完整的集合列表,但對於單元集合,這應該不是問題。

+1

從1.8開始,有[Collection.find()](http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#find())方法。 1,比'set.find {true}'有點短使用' – 2015-04-22 13:05:09

18

另外一個可能性(這將在Java或Groovy中工作):

set.iterator().next() 
+0

乾淨整潔。 – Vincent 2013-07-10 09:59:21

0

由於Java 8,這裏是另一個解決方案,爲Java和Groovy工作:

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

即使這個問題是相當古老的,我分享我的只是一個更漂亮的解決方案。

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

如果需要採取空考慮(在此問題的情況下):

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

希望它能幫助! :)

相關問題