如何在没有提供排序的情况下排序排序集,以及元素的相等性如何与排序一起使用

时间:2013-08-03 22:20:00

标签: scala

我对排序集有两个混淆,

  • 如果我们不提供对元素的排序,并且元素没有默认排序,例如整数或字符串,那么底层排序集是如何排序的?

  • 如果我们定义了顺序,那么相等的比较是如何进行的?使用默认的等于方法或比较方法中定义的方法?

由于

3 个答案:

答案 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)

  1. 如果您没有提供订购,并且在您要存储在SortedSet中的元素类型的隐式范围中找不到,则它将无法编译。

  2. 我不确定,但我打赌==,这将是默认的