【发布时间】:2020-05-15 09:49:54
【问题描述】:
我尝试根据某个标准对复杂结构的案例类进行排序,该标准具有几个(有限数量)特征。排序应该按照排名表进行。
通过以下示例进行说明:
我有一个带有 bird 字段的工件,它可以将表达式 blackbird、starling、raven、budgie 作为字符串。序列应该按顺序排序(不是按字母顺序)
- 椋鸟
- 黑鸟
- 小伙伴们
- 乌鸦
鸟类本身可能相互依赖,因此不能改变组内的顺序。
到目前为止,我尝试的是首先对它们进行分组,然后对这些组进行排序并将它们重新拼凑在一起。然而它看起来很笨拙,出现了两个问题:
- groupBy 会一直保持之前的顺序吗?通过查看 ScalaDoc 参考,在我看来它会。
- 有没有比以下更有效/不那么笨拙的方法来对组进行排序:
编辑:添加了一个完整的例子,修复了一个问题
case class Abc(bird: String)
val grouped = Seq(Abc("budgies"), Abc("ravens"), Abc("starlings"), Abc("ravens"), Abc("starlings"), Abc("blackbirds"), Abc("blackbirds"), Abc("ravens"))
val lookup: Map[String, Int] = Map(
"starlings" -> 1,
"blackbirds" -> 2,
"budgies" -> 3,
"ravens" -> 4
)
object MyOrdering extends Ordering[Abc] {
def compare(a: Abc, b: Abc): Int = lookup(b.bird) - lookup(a.bird)
}
println(grouped.toSeq.sorted(MyOrdering))
【问题讨论】: