Scala通过排序对集合进行排序

时间:2018-07-12 16:58:39

标签: scala sorting set

我是Scala的初学者。我想对Set进行排序,然后为用户提供新的排序Set,因此旧Set应该保持不变。

我已经有一个例子,例如BaseTrait [+ A],我想丰富它。

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 

}

1 个答案:

答案 0 :(得分:1)

您可以使用注释中提到的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)