使用Ordering对Scala集合进行排序

4

我是Scala的初学者。我想对一个Set进行排序,然后提供给用户一个新的已排序的Set,所以旧的Set应该保持不变。

我已经有了一个类似于BaseTrait[+A]的trait,我想要扩展它。

trait BaseSet[+A] { //it extends scala Set

  def +[B >: A](item: B): BaseSet[B]

  def -[B >: A](item: B): BaseSet[B]

  def size: Int

  def contains[B >: A](item: B): Boolean  

}

trait SetWithSort[+A] extends BaseSet[A] {

  abstract def sort[B](implicit ordering: Ordering[_ >: B]): Set[B]

  def logicBeforeSorting(): Set[B] ={
    sort
  }
}

object MainObject {
  def OrderByName:Ordering[String] => Set[String] = ???  

  def execute[T](callback:Ordering[T]): Ordering[T] = callback //Problem, I // want Set[T] here

// I want to get a new Set with elements sorted as per my provided ordering 

}

2
也许你想创建自己的版本,但为什么不使用 SortedSet 呢? - joel
我在我的应用程序中已经有了一个特质Set[+A],我想要丰富它,但是我不知道如何做。 - AZ_
1
那么所有这些对SetSet[B]Set[String]等)的引用实际上都是指你自己的trait Set[+A]而不是标准库中的Set - jwvh
这不是完整的代码,而是trait BasicSet扩展了Scala集合Set。因此它们是Scala集合Set,所有这些引用也是如此。很抱歉,但这很令人困惑。 - AZ_
1
Scala中的Set没有顺序,因此无法进行排序。这就是为什么存在SortedSetTreeSet,以防您需要对保证唯一性元素的集合进行排序。 - jwvh
谢谢。您能否提供一个示例,说明如何使用提供的排序规则将集合排序为已排序的集合(sortedSet)。谢谢。 - AZ_
1个回答

2

你可以像评论中提到的那样使用SortedSet,例如:

import scala.collection.SortedSet

def sortSet[A](unsortedSet: Set[A])(implicit ordering: Ordering[A]): SortedSet[A] = 
    SortedSet.empty[A] ++ unsortedSet

如果您提供了一个类型为Ordering[A]的隐式参数,将使用此排序方式。
默认排序的使用方法:
sortSet(Set(2, -1, 0, -2, 1)) // result TreeSet(-2, -1, 0, 1, 2)

以上代码之所以有效是因为Scala在作用域中已经提供了一个隐式的Ordering[Int]

使用提供的排序:

implicit val reverseOrdering = Ordering[Int].reverse
sortSet(Set(-15, 100, -3, 101, -5)) // result TreeSet(101, 100, -3, -5, -15)

// or by providing ordering directly:
val reverseOrdering = Ordering[Int].reverse
sortSet(Set(-15, 100, -3, 101, -5))(reverseOrdering) // result TreeSet(101, 100, -3, -5, -15)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接