2017-10-31 8 views
0

私は現在、スカラを使ってハフマンアルゴリズムを実装しようとしています。これを行うには、ツリー内の異なるノードの順序に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はコンパイルされますが、それは私が望むものではありません。

ノンケースクラスのフィールドに基づいて優先順位キューを並べ替えるにはどうすればよいですか?

+1

あなたのクラスにval beforを置くことができます(そうでない場合は、メンバーではなくコンストラクタの単なるパラメータです)。 – dk14

+0

@ dk14この行はコンパイルされましたが、今度はnodeMap宣言行にコンパイルエラーが見つかりました:scala.math.ordering [BinarySearchTree]必須:BinarySearchTree ...任意のアイデア? –

+0

@SimonBears 'PriorityQueue.apply [T](T *)(Ordering [T]):PriorityQueue [T]'。 'PriorityQueue.apply(Ordering.by(...)) 'を呼び出すときに、' PriorityQueue [Ordering [BinarySearchTree]]を作成しようとしていると思います。 'PriorityQueue()(Ordering.by(...))'、空の括弧がうまくいくと思います。 .by(...)) '。 – HTNW

答えて

1

これは不完全ですがコンパイルされます。

import scala.collection.immutable.ListMap 
import collection.mutable.PriorityQueue 

class BinarySearchTree(val weight: Int) //weight is now member data 

case class ForkNode(left: BinarySearchTree 
        , right: BinarySearchTree 
        , chars: List[Char] 
        , override val weight: Int //now needs override 
        ) extends BinarySearchTree(weight) 

case class LeafNode(char: Char 
        , override val weight: Int //now needs override 
        ) extends BinarySearchTree(weight) 

def createBST(inputFile: ListMap[Char,Int]): BinarySearchTree = { 
    def weightOrder(t2: BinarySearchTree) = t2.weight 

    val bst: BinarySearchTree = LeafNode('c',2) //build something of proper type 

    val nodeMap:PriorityQueue[BinarySearchTree] = 
    PriorityQueue(bst)(Ordering.by(weightOrder)) //create PriorityQueue 

    null //etc. 
} 

PriorityQueueあなたがPriorityQueue[BinarySearchTree]をしたいならば、コンストラクタの引数はタイプBinarySearchTreeなく派生型(すなわち、Aノード)でなければなりませんので、変更可能とタイプ不変です。

+0

LeafNodeで構築する必要がありますか?宣言でPriorityQueueを空にすることはできませんか? –

+0

'LeafNode()'をイラストとして使用しました。それは 'null'でもかまいません。コンパイラはそれを型 'BinarySearchTree'として認識しなければなりません。 – jwvh

+0

ヌルの場合は、空のプライオリティキューになりますか? –

関連する問題