2014-06-27 51 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 

这是保证让他们互相排斥。

相关问题