2014-06-27 75 views
10

documentation表示Set.head返回「第一個」項目,而.tail返回「除第一個以外的所有項目」。*由於Set沒有真正的「第一個」項目,因此文檔警告如果沒有有序類型,可能會在不同的運行中得到不同的結果。但你保證尾巴不會包括頭部嗎?集合的頭部和尾部是否保證相互排斥?

的原因,我問的是我想知道如果它是確定改乘下一個Set這樣的:

def recurse(itemsToExamine: Set[Item], acc: Result): Result = 
    if (itemsToExamine.isEmpty) acc 
    else { 
    val item = itemsToExamine.head 
    recurse(
     item.spawnMoreItems ++ itemsToExamine.tail, 
     acc.updatedFor(item)) 
    } 

如果這是合法的,這肯定會是不是轉換從SetSeq和背部更好以便在每次遞歸時分離頭部和尾部。 *實際上,它表示「選擇第一個項目」和「選擇除第一個項目以外的所有項目」。我認爲「選擇」只是一個不好的選擇。如果有理由說「選擇」而不是「退貨」,請告訴我。

回答

4

我不是100%肯定這一點,因爲我還沒有實施看了太多,但對於任何HashSet還有那些已經在價值觀的基礎上,hashCodeInt類型)的隱式排序Set

這意味着對於任何Set實例,調用headtail都將遵守該順序,因此它不會是相同的元素。更重要的是,通過給定Set實例的元素的連續迭代應該以相同順序產生元素,因爲Set是不可變的。

雖然訂單未知,但有一個用於任何實例,只要您向Set添加(可變或不可變)新元素,就可能會發生變化。

4

依靠headtailSet(無需排序)充其量是有風險的。

對於您的情況,只需從您的Set開始獲取Iterator首先與theSet.toIterator,然後遞歸遍歷迭代器。當然,迭代器保證第一個元素與其他元素不同。

+1

'Iterator'的'.tail'等價於什麼?調用'.next'後'.toSet'? –

3

你可以這樣做:

val set = Set(1, 2, 3) 
val head = set.head 
val tail = set - head 

這是保證讓他們互相排斥。

相關問題