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 に答える