我有一个函数需要来自Set
类型的两个参数:
def union[A](set1: Set[A], set2: Set[A]): Set[A] = {
set1.foldLeft(set2){ (set, elt) => (set + elt) }
}
应用功能如下:
union(Set(3,4,5,6), Set(34,56,23))
我已经:
res2: Set[Int] = Set(5, 56, 6, 34, 3, 23, 4)
但我希望:
Set(3,4,5,6,34,56,23)
为什么我收到无序结果?
答案 0 :(得分:4)
Set是一种无序数据类型,通常订单由实现决定,通常无法保证(更不用说保证插入顺序)。
获取您似乎想要的行为(不同,插入有序)我建议使用List
和distinct
方法
(List(3,4,5,6) ++ List(34,56,23)).distinct
res0: List[Int] = List(3, 4, 5, 6, 34, 56, 23)
答案 1 :(得分:1)
设置不保留订单 - 如果您希望将最终结果作为最终结果,可以尝试这样做,请注意它会返回ArrayBuffer
(然后您可以将其转换为您需要的):
union(Set(3,4,5,6), Set(34,56,23)).toSeq.sorted
当我们处理一个简单的Ordering
(Int)时,我们不需要指定它的顺序,因为它是隐式完成的。由于您的union
def采用任何类型,因此需要根据您传入的类型指定排序。See this on guidance on creating an Ordering。