Scala不可变SortedSet在删除时不“稳定”

时间:2009-08-13 11:32:39

标签: scala scala-collections

我要处理scala 2.7.5中的不可变对象,其中一个成员是immutable Sortedset。 我没有添加任何问题,合成,它给出:

class MyClass[A](s:SortedSet[A]) {
  ...
  def  + (elem:A):MyClass[A] {
    new MyClass(s + elem)
  }
}

它有效,因为+运算符在trait sortedSet中重载以返回SortedSet。

不幸的是,删除元素失败,因为 - 方法没有重载:

class MyClass[A](s:SortedSet[A]) {
  ...
  def  - (elem:A):MyClass[A] {
    new MyClass(s - elem) // Compiler error: (s - elem) is a Set[A]
  }
}

当我压制一个知道以下内容的元素时,有谁知道如何获取一个有序集合: - 我不想使用像TreeSet这样的更具体的集合。 - 我不能使用较少特定的特性作为Set [A]而不是我的SortedSet。

3 个答案:

答案 0 :(得分:3)

如果你可以等到2.8,看起来这样可以正常工作。

来自SortedSetLike.scala(不可变SortedSet特征的超级特征)

trait SortedSetLike[A, +This <: SortedSet[A] with SortedSetLike[A, This]] extends Sorted[A, This] with SetLike[A, This]

这会使This输入SortedSet。然后在SetLike.scala中,-运算符的签名是

def - (elem: A): This

因此,在SortedSet上使用时,会正确返回SortedSet

答案 1 :(得分:1)

与人们的想法相反,-不能保证SortedSet结果。小套装通过不同的类别进行优化。由于Set的-是抽象的,因此您不知道如何实现它,并且SortedSet可以以返回未排序集的方式自由实现它。

以下效率低下,但有效。您可以使用它,与asInstanceOf一起使用,或等待2.8。 : - )

class MyClass[A](s: SortedSet[A]) {
  def -(elem: A)(implicit view: A => Ordered[A]): MyClass[A] = {
    new MyClass(TreeSet(s.toList - elem: _*))
  }
}

答案 2 :(得分:0)

我认为你需要做的就是施展它。 “ - ”返回一个Set,但它也是一个SortedSet。它可能不漂亮,但它的工作原理:

class MyClass[A](s:SortedSet[A]) {
    def  +(elem:A): MyClass[A] = {
      new MyClass(s + elem)
    }

    def  -(elem:A): MyClass[A] = {
      new MyClass((s - elem).asInstanceOf[SortedSet[A]])
    }

    override def toString = "sorted set = " + s
  }

  val a = new MyClass(new TreeSet[Int])
  println(a) // prints "sorted set = Set()"
  val b = a + 1
  println(b) // prints "sorted set = Set(1)"
  val c = a - 1
  println(c) // prints "sorted set = Set()"