scala - 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
}
解决方案
您可以使用评论中提到的 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)
推荐阅读
- ios - 无法使用在 iOS 中共同编写的 Kotlin 扩展函数作为 Swift 扩展
- python-3.x - How to count consecutive value change to zero in column python
- c# - EF Core 动态忽略列
- r - 在具有不变项的 svyglm 上使用 broom::tidy() 时下标越界
- python - 无法将 None 值发送到从 python 到 mysql 的浮点字段
- javascript - React 组件未通过状态更新重新渲染
- angular - 设置包含所有相关项目的标题,
- javascript - div 从指定顶部位置展开
- python - 在列表末尾插入是否具有 O(1) 时间复杂度?
- c# - LINQ 根据字符串数组选择列 []