代码之家  ›  专栏  ›  技术社区  ›  Nicolas

删除时scala不可变排序集不“稳定”

  •  3
  • Nicolas  · 技术社区  · 15 年前

    我要处理scala 2.7.5中的不可变对象,它的成员之一是 immutable Sortedset . 我不反对加法,也不反对合成法,它给出:

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

    而且它也可以工作,因为+操作符在trait sortedset中超载以返回sortedset。

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

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

    当我抑制一个元素时,是否有人知道我如何获得一个排序集,因为我知道: -我不想使用像treeset这样更具体的集合。 -我不能用一个不那么具体的特性来代替我的排序集。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Ben Lings    15 年前

    如果你能等到2.8,这看起来会正常工作。

    SortedSetLike.scala (不变的超特性 SortedSet 特质)

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

    这使得 This A型 排序集 . 然后在 SetLike.scala ,的 - 操作员签名为

    def - (elem: A): This
    

    所以会正确返回 排序集 当使用在 排序集 .

        2
  •  1
  •   Daniel C. Sobral    15 年前

    与人们的想法相反, - 不保证 SortedSet 结果。小集合通过不同的类进行优化。自SET - 是抽象的,您不知道如何实现它,以及 排序集 可以自由地以返回非排序集的方式实现它。

    以下是低效的,但它是有效的。你可以用它,一起生活 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: _*))
      }
    }
    
        3
  •  0
  •   Walter Chang    15 年前

    我想你所要做的就是铸造它。”-“返回一个集合,但它也是一个排序集。它可能不漂亮,但它起作用:

    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()"