2017-02-14 2 views
3

私はHuffmanTreeを構築するのに役立つ何かを見つけるためにウェブをブラウズしていましたが、このコードを見つけたのはhttp://rosettacode.org/wiki/Huffman_coding#Javaです。Java - TreeはNodeのインスタンスですか?

私はJavaを使い慣れていないし、これを私のレベルよりも上手く使うことができませんでしたが、私はまだそれに興味を持っていました(それは短く、一見有効なコードなので)ほとんどのことを理解したいと思っています(注:私は失敗しました)。
しかし、私の注目を集めたコードが1つありました: "instanceof"メソッド。

私のコードには3つのクラスがあります。
一つのスーパークラス(HuffmanTree)と2つのサブクラス(HuffmanNodeとHuffmanLeaf)と次のようになります。私は、「instanceofの」と限り私はそれを理解し、それがオブジェクトかどうかを伝えますについて少し読ん

abstract class HuffmanTree implements Comparable<HuffmanTree> { 
    public final int frequency; // the frequency of this tree 
    public HuffmanTree(int freq) { frequency = freq; } 

    // compares on the frequency 
    public int compareTo(HuffmanTree tree) { 
     return frequency - tree.frequency; 
    } 
} 

class HuffmanLeaf extends HuffmanTree { 
    public final char value; // the character this leaf represents 

    public HuffmanLeaf(int freq, char val) { 
     super(freq); 
     value = val; 
    } 
} 

class HuffmanNode extends HuffmanTree { 
    public final HuffmanTree left, right; // subtrees 

    public HuffmanNode(HuffmanTree l, HuffmanTree r) { 
     super(l.frequency + r.frequency); 
     left = l; 
     right = r; 
    } 
} 

ブール値trueまたはfalseを返す、特定のクラスのインスタンスです。
論理的には、親は子のインスタンスにすることはできません。

ただし、(tree instanceof HuffmanNode)を書くとtrueを返します(treeはHuffmanTreeクラスのオブジェクトです)。もし書き込むと(tree instanceof HuffmanLeaf)、false(論理的に)を返します。
しかしtreeがHuffmanNodeの親である場合(tree instanceof HuffmanNode)はtrueを返しますか?

+0

'tree'オブジェクトは' HuffmanTree'の静的型を持つことができましたが、 'HuffmanTree'が' abstract'なので動的型( 'instanceof'が使用しているもの)であってはいけません。 –

+0

このパターンに注意してください。これはあなたの心を吹き飛ばす再帰的な定義の巨大な力です。バイナリツリーのすべてのノードは、2つの子を持つため、バイナリツリーです。リーフノードは、子(まだ)を持たない単なるツリーです。したがって、ツリー内のすべてのノードは、ノード(それが値を保持する)と同時にツリーです。ソフトウェア開発(そして数学)の非常に大きな部分は、この基礎に基づいています。 –

+0

しかし、 'instanceof'はコードのにおいであり、適切な型分類の代わりにあまりに頻繁に使用されます。 –

答えて

3

論理的には、Treeは、子としてのNodeの2つの参照を持つ単純なものです。

ツリーがHuffmanNodeの親である場合(tree instanceof HuffmanNode)はtrueを返しますか?なぜ?!

treeHuffmanNode(あなたが見たように)でなければならない、とはい、任意のHuffmanNodeは(自身がノードまたは葉することができます)他の二つのHuffmanTreeインスタンスの親です。

しかしHuffmanNodeは...説明HuffmanTree

class HuffmanNode extends HuffmanTree { // <----- 
    public final HuffmanTree left, right; // subtrees 

ある

あなたはこのことについてわからないが(HuffmanNodeのinstanceof木)

、書き込み

... HuffmanTreeは抽象インスタンス newすることができますので、それは、次のように宣言されていなければならないことを意味する、

HuffmanTree tree = new HuffmanNode(...); 
        ^^^^ This is the object's type 
abstractあるので

ツリーがHuffmanTree

クラスのオブジェクトであります

(個人的には、リーフクラスは2つのnullサブツリーを持つノードになります)

+0

興味深い...しかし、私は抽象クラスがどのように動作するのか、なぜそれらが使われているのか理解していません。 HuffmanTreeクラスが抽象クラスでない場合、ステートメントはtrueを返しますか?また、あなたの記事の一番下にあるコードが興味深いものになっています。前のステートメント( "tree"の前)がHuffmanTree型でなければならないと言ったら、どうしてそれを "新しいHuffmanNode()"として宣言できますか? – Schytheron

+0

はい、「抽象的な」で読んでください。あなたを助けるのに十分なリソースがあります。 Abstractは 'instanceof'の戻り値を制御しません、そして' extends'キーワードはそれを行います。私の指摘は、あなたは '抽象クラス 'を'新しくできないということでした。したがって**あなたの質問に表示されなかったコードで** '新しいHuffmanNode()'でなければなりません。うまくいけばこれらのヘルプhttp://stackoverflow.com/a/9552547/2308683とhttp://stackoverflow.com/questions/11007459/why-assign-a-new-arraylist-to-a-list-variable –

関連する問題