2

我在 Scala 中有以下层次结构

abstract class MyAbstractClass
case class Child1(alpha: MyAbstractClass, points: Int) extends MyAbstractClass
case class Child2(beta: Char, points: Int) extends MyAbstractClass

现在我有一个列表 List(MyAbstractClass type objects ... Chil1 或 Child2 )

我想根据点对上面的列表进行排序。如何在 Scala 中编写这个?

4

3 回答 3

4

您应该添加一个调用points到您的基类的方法:

abstract class MyAbstractClass { def points:Int }

子类已经实现了这个方法,因为它们是案例类,所以你不需要改变它们。

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))
于 2012-10-16T14:27:40.437 回答
3

您可以在这里使用结构类型来帮助您

list.sortBy{
  case x: {def points: Int} => x.points
}

sortBy 采用一个函数,当应用于每个元素时将返回要排序的值。case 语句说“如果 x 是具有“点”方法的类型,则返回 x.points

于 2012-10-17T16:08:23.557 回答
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
}
于 2012-10-17T15:05:38.813 回答