私は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を返しますか?
'tree'オブジェクトは' HuffmanTree'の静的型を持つことができましたが、 'HuffmanTree'が' abstract'なので動的型( 'instanceof'が使用しているもの)であってはいけません。 –
このパターンに注意してください。これはあなたの心を吹き飛ばす再帰的な定義の巨大な力です。バイナリツリーのすべてのノードは、2つの子を持つため、バイナリツリーです。リーフノードは、子(まだ)を持たない単なるツリーです。したがって、ツリー内のすべてのノードは、ノード(それが値を保持する)と同時にツリーです。ソフトウェア開発(そして数学)の非常に大きな部分は、この基礎に基づいています。 –
しかし、 'instanceof'はコードのにおいであり、適切な型分類の代わりにあまりに頻繁に使用されます。 –