首页 > 解决方案 > Scala 使用排序对集合进行排序

问题描述

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

我已经有一个像 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 

}

标签: scalasortingset

解决方案


您可以使用评论中提到的 SortedSet,例如:

import scala.collection.SortedSet

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

如果您提供 type 的隐式参数,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)

推荐阅读