我是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
}
答案 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)