1

2 つのケース クラスに一致するこの比較関数が必要ですが、少し冗長です。

リーフは、リスト内で常にソートされた順序になっています。

  abstract class CodeTree
  case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree
  case class Leaf(char: Char, weight: Int) extends CodeTree

  def sortCodeTreeFun(x: CodeTree, y: CodeTree) = {
    (x, y) match {
      case (x1: Leaf, y1: Leaf) => true
      case (x1: Fork, y1: Leaf) => x1.weight < y1.weight
      case (x1: Leaf, y1: Fork) => x1.weight < y1.weight
      case (x1: Fork, y1: Fork) => x1.weight < y1.weight
    }
  }

CodeTree コンストラクターを次のように変更しようとしました。

  abstract class CodeTree(weight: Int)

x と y を直接比較できるようにしますが、コンパイラは次のように言います。

「コンストラクタ CodeTree の引数が不十分です: (重み: Int)patmat.Huffman.CodeTree」

sortCodeTreeFun メソッドを短縮する別の方法はありますか?

4

2 に答える 2

3

コードツリーのような要素を並べ替えたい場合は、次を使用できます Sorting.stableSort

于 2012-10-25T08:58:26.600 に答える
2

あなたは簡単に言うことができます:

def sortCodeTreeFun(x: CodeTree, y: CodeTree) = {
  (x, y) match {
    case (_: Leaf, _: Leaf)           => true
    case (x1: CodeTree, y1: CodeTree) => x1.weight < y1.weight
  }
}

そして、抽象クラス CodeTree を次のように定義します。

abstract class CodeTree {
  def weight: Int
}

エラーの理由は、パラメーターを受け取るクラスを拡張するときに、パラメーターを指定する必要があるためです。だから

abstract class CodeTree(weight: Int)

次のように拡張する必要があります

case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree(weight)

それはあなたが得ていたエラーが言っていたことです:

"not enough arguments for constructor CodeTree: (weight: Int)"

weightこれは、 CodeTree を拡張するときに必要な引数を指定していなかったためです。

ただし、このアプローチの問題は、weight が CodeTree のメンバーではないため、CodeTree 型のインスタンスからアクセスできないことです。つまり、あなたがした場合:

 scala> Fork(...).asInstanceOf[CodeTree].weight
 <console>:11: error: value weight is not a member of CodeTree

したがって、パターン マッチでx1.weightは、 x1 の型が a であり、 aCodeTreeCodeTree持たないため、実行できませんweight

于 2012-10-23T21:33:09.853 に答える