Scala 一个集合的头和尾是否保证相互排斥?
说明Scala 一个集合的头和尾是否保证相互排斥?,scala,recursion,scala-collections,Scala,Recursion,Scala Collections,说明Set.head返回“第一个”项,.tail返回“除第一个以外的所有项”。*由于Set实际上没有“第一个”项,文档警告说,如果没有有序类型,您可能会在不同的运行中得到不同的结果。但是你能保证尾巴不包括头吗 我问这个问题的原因是我想知道这样递归一个集是否合适: def recurse(itemsToExamine: Set[Item], acc: Result): Result = if (itemsToExamine.isEmpty) acc else { val item
Set.head
返回“第一个”项,.tail
返回“除第一个以外的所有项”。*由于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))
}
如果这是合法的,那么它肯定比从Set
转换到Seq
再转换回来更好,以便在每个递归上分离头和尾。
*实际上,它说“选择第一项”和“选择除第一项以外的所有项目”。我认为“选择”只是一个糟糕的词语选择。如果说“选择”而不是“返回”是有原因的,请让我知道。我不是100%确定这一点,因为我没有过多地研究实现,但是对于任何HashSet
都有一个基于hashCode
的隐式排序(类型Int
)已在集合中的值的
这意味着对于任何Set
实例,对head
和tail
的调用都将遵循该顺序,因此它将不是相同的元素。更重要的是,通过给定集合
实例的元素的连续迭代应该以相同的顺序生成元素,因为集合
是不可变的
需要注意的是,尽管顺序未知,但在任何情况下都会有一个,只要您向集合添加新元素(可变或不可变)
依赖头和尾在集合
(无顺序)上,可能会发生变化,这充其量是有风险的
在您的情况下,只需从集合
中获取一个迭代器
,首先使用集合到迭代器
,然后在迭代器上递归。当然,迭代器保证第一个元素与其他元素不同。您可以这样做:
val set = Set(1, 2, 3)
val head = set.head
val tail = set - head
这保证了它们相互排斥。对于迭代器
,什么是.tail
的等价物.toSet在调用后设置
。下一步
?