1

我对排序集有两个困惑,

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

  • 如果我们定义了排序,那么相等性的比较如何呢?使用默认的相等方法还是比较方法中定义的方法?

谢谢

4

3 回答 3

2

如果Ordering实例化 a 时范围内没有SortedSet,那就是编译错误。

在 REPL 中尝试:

scala> collection.SortedSet[Object]()
<console>:8: error: No implicit Ordering defined for Object.
              collection.SortedSet[Object]()
                                      ^

Ordering定义平等。从scaladoc

def equiv(x: T, y: T): 布尔值

如果 x == y 在排序中返回 true。

于 2013-08-03T22:42:10.317 回答
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
    }
  }
于 2013-08-03T22:37:58.607 回答
0
  1. 如果您不提供 Ordering 并且在您想要存储在 SortedSet 中的元素类型的隐式范围内找不到任何内容,则它将无法编译。

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

于 2013-08-03T22:38:30.110 回答