私は現在、スカラを使ってハフマンアルゴリズムを実装しようとしています。これを行うには、ツリー内の異なるノードの順序にPriorityQueueを使用することを考えました。したがって、BinarySearchTreeノードのPriorityQueueを作成する必要があります。しかし、Scalaはケースクラスのフィールドで注文することしかできません。Non-caseクラスのフィールドでPriorityQueueを注文する
これは私が欲しい欲しいれる:
class BinarySearchTree(weight: Int)
case class ForkNode(left: BinarySearchTree, right: BinarySearchTree, chars: List[Char], weight: Int) extends BinarySearchTree(weight)
case class LeafNode(char: Char, weight: Int) extends BinarySearchTree(weight)
def createBST(inputFile: ListMap[Char,Int]): BinarySearchTree = {
def weightOrder(t2: BinarySearchTree) = t2.weight
val nodeMap:PriorityQueue[BinarySearchTree] = PriorityQueue(Ordering.by(weightOrder))
null
}
しかし、それはコンパイルされません。しかし、def weightOrder(t2: ForkNode) = t2.weight
はコンパイルされますが、それは私が望むものではありません。
ノンケースクラスのフィールドに基づいて優先順位キューを並べ替えるにはどうすればよいですか?
あなたのクラスにval beforを置くことができます(そうでない場合は、メンバーではなくコンストラクタの単なるパラメータです)。 – dk14
@ dk14この行はコンパイルされましたが、今度はnodeMap宣言行にコンパイルエラーが見つかりました:scala.math.ordering [BinarySearchTree]必須:BinarySearchTree ...任意のアイデア? –
@SimonBears 'PriorityQueue.apply [T](T *)(Ordering [T]):PriorityQueue [T]'。 'PriorityQueue.apply(Ordering.by(...)) 'を呼び出すときに、' PriorityQueue [Ordering [BinarySearchTree]]を作成しようとしていると思います。 'PriorityQueue()(Ordering.by(...))'、空の括弧がうまくいくと思います。 .by(...)) '。 – HTNW