2012-10-16 190 views
2

我有以下層次斯卡拉如何在Scala中對象是動態的時候對列表進行排序?

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

現在我有一個列表 列表(MyAbstractClass類型的對象......無論是Chil1或CHILD2)

我想排序基於點上面的列表。如何在Scala中寫這個?

回答

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)) 
+0

Kim Stebel - MyAbstractClass由其他人提供,因此我無法添加def點:int爲其。 – Shakti

+0

If你真的不能改變這個類,你總是可以在'MyAbstractClass'和你的case類之間的層次結構中插入另一個。 –

+0

謝謝我能夠在另一種情況下使用你的解決方案。 – Shakti

1

使用稍微不同的方法 1)在不添加點無功於母公司 類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 
} 
3

您可以在層次結構使用結構打字幫助你在這裏

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

sortBy使用一個函數,當應用於每個元素時將返回值進行排序。案例聲明中說:「如果x是一種具有」點「方法的類型,則返回x.points

相關問題