1

我想要这个匹配两个案例类的比较函数,但它有点冗长。

叶子总是在列表中排序。

  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 时没有提供所需的参数。

这种方法的问题在于权重不是 CodeTree 的成员,因此不能从 CodeTree 类型的实例中访问。也就是说,如果你这样做了:

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

因此,在您的模式匹配中,您将无法这样做,x1.weight因为 x1 的类型是 aCodeTree并且CodeTree没有 a weight

于 2012-10-23T21:33:09.853 回答