我在Scala中有以下层次结构
abstract class MyAbstractClass
case class Child1(alpha: MyAbstractClass, points: Int) extends MyAbstractClass
case class Child2(beta: Char, points: Int) extends MyAbstractClass
现在我有一个清单 List(MyAbstractClass类型对象...... Chil1或Child2)
我想根据点对上面的列表进行排序。如何用Scala写这个?
答案 0 :(得分:4)
您应该向您的基类添加一个名为points
的方法:
abstract class MyAbstractClass { def points:Int }
子类已经实现了这个方法,因为它们是case类,所以你不需要更改它们。
case class Child1(alpha: MyAbstractClass, points: Int) extends MyAbstractClass
case class Child2(beta: Char, points: Int) extends MyAbstractClass
然后您可以使用此方法对列表进行排序。
println(List(Child2('a',0),Child1(Child2('b',2),3)).sortBy(_.points))
答案 1 :(得分:3)
您可以使用结构类型帮助您
list.sortBy{
case x: {def points: Int} => x.points
}
sortBy接受一个函数,当应用于每个元素时,它将返回值以进行排序。 case语句说“如果x是具有”point“方法的类型,则返回x.points
答案 2 :(得分:1)
采用略有不同的方法 1)不向父类添加点var 2)不改变类的层次结构
包含MyAbstractClass
类型对象的列表list.sortWith((x,y) => point(x) < point(y))
def point(mylist: MyAbstractClass): Int = mylist match {
case Child1(a, p) => p
case Child2(b, p) => p
}