我对排序集有两个混淆,
如果我们不提供对元素的排序,并且元素没有默认排序,例如整数或字符串,那么底层排序集是如何排序的?
如果我们定义了顺序,那么相等的比较是如何进行的?使用默认的等于方法或比较方法中定义的方法?
由于
答案 0 :(得分:2)
如果在实例化Ordering
时范围内没有SortedSet
,那就是编译错误。
在REPL中尝试:
scala> collection.SortedSet[Object]()
<console>:8: error: No implicit Ordering defined for Object.
collection.SortedSet[Object]()
^
Ordering
定义了相等性。来自the scaladoc:
def equiv(x:T,y:T):布尔值
如果在排序中x == y,则返回true。
答案 1 :(得分:1)
首先,如果您不提供排序且没有可用的默认排序,您将收到编译器错误:
case class DoesntWork(i:Int)
//error: No implicit Ordering defined for DoesntWork.
val doesntWork = SortedSet(DoesntWork(1), DoesntWork(2))
其次,我对你在这里想说的内容感到困惑,但你需要为自定义类型实现自己的比较功能:
implicit val worksNowOrdering = new Ordering[DoesntWork]{
def compare(x: DoesntWork, y: DoesntWork): Int = {
if (x.i < y.i) -1
else if (x.i > y.i) 1
else 0
}
}
答案 2 :(得分:0)
如果您没有提供订购,并且在您要存储在SortedSet中的元素类型的隐式范围中找不到,则它将无法编译。
我不确定,但我打赌==,这将是默认的