当对象是动态的时,如何在Scala中对列表进行排序?

时间:2012-10-16 14:20:25

标签: list scala sorting

我在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写这个?

3 个答案:

答案 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
}