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在调用
后设置
。下一步