2017-05-07 11 views
1

データ構造クラスのファイルから文字列をエンコードするためのハフマンツリーを作成する割り当てが与えられましたが、少し問題があります。私はツリーを構築し、値をエンコードする方法を知っていますが、ソートされたリストに入れられるノードの配列を作成する必要があります。 私は、ノードの配列の長さにわたって反復し、HashMapを反復するforeachループをネストしたforループを書きました。問題は、各文字ごとに新しいノードを作成することにあります。私のコードは、配列にすべての値を追加するようではないと私は複数の異なるループを試してみましたが、それらはすべて同様の結果を生成します。キーコンストラクタとキーコンストラクタに渡すことができる2つの配列を作成するという考えがありましたが、それは実際には機能しません。ここでHashMapの値を持つオブジェクトの配列を構築する

は、ノードのためのクラスです:

public class HuffmanTreeNode { 
    public char key; 
    public int value; 
    public HuffmanTreeNode nextNode = null; 
    public HuffmanTreeNode leftChild = null; 
    public HuffmanTreeNode rightChild = null; 

    public HuffmanTreeNode(char k, int v) { 
     key = k; 
     value = v; 
    } 

    public HuffmanTreeNode(HuffmanTreeNode left, HuffmanTreeNode right) { 
     leftChild = left; 
     rightChild = right; 

     value = rightChild.value + leftChild.value; 
    } 

    public boolean isLeaf() { 
     if (leftChild == null && rightChild == null) { 
      return true; 
     } 

     return false; 
    } 
} 

これは、ノードの配列を構築するためのコードです:

HashMap<Character, Integer> frequencies = new HashMap<Character, Integer>(); 
    for (String s : fileContents) { 
     for (int i = 0; i < s.length(); i++) { 
      char c = s.charAt(i); 
      Integer value = frequencies.get(new Character(c)); 

      if (value != null) { 
       frequencies.put(c, new Integer(value + 1)); 
      } else { 
       frequencies.put(c, 1); 
      } 
     } 
    } 

    char[] chars = new char[frequencies.size()]; 
    int[] freq = new int[frequencies.size()]; 

    for (int i = 0; i < frequencies.size(); i++) { 
     for (HashMap.Entry<Character, Integer> entry : frequencies.entrySet()) { 
      chars[i] = entry.getKey(); 
      freq[i] = entry.getValue(); 
     } 
    } 

    for (int i = 0; i < frequencies.size(); i++) { 
     System.out.println(chars[i] + " " + freq[i]); 
    } 


    SortedList sortedList = new SortedList(); 
    HuffmanTreeNode[] nodes = new HuffmanTreeNode[frequencies.size()]; 

    for (int i = 0; i < nodes.length; i++) { 
     nodes[i] = new HuffmanTreeNode(chars[i], freq[i]); 
    } 
+0

いくつかの入力例と予想される出力でもう少し質問を明確にすることができますか? –

+0

私の入力例は、読み込まれているファイルの内容(fileContents)を含むStringの配列です。ファイルにはHello/how/areの行があります( '/'は新しい行を示します - 合計3行)。取得する必要のある出力は、それぞれの文字と表示される回数です(すでにHashMapに入っています)。私はちょうど私の出力は、各インデックスで同じ文字と頻度であるので、私はちょうどイテレートするとは思わない。 –

+0

インスタンスフィールドにパブリックアクセスを与えないでください。 – scottb

答えて

0

私は実際にちょうどループを変更することにより、自分のコードを修正:

for (int i = 0; i < frequencies.size(); i++) { 
    for (HashMap.Entry<Character, Integer> entry : frequencies.entrySet()) { 
     chars[i] = entry.getKey(); 
     freq[i] = entry.getValue(); 
    } 
} 

to:

int index = 0; 
    for (HashMap.Entry<Character, Integer> entry : frequencies.entrySet()) { 
     chars[index] = entry.getKey(); 
     freq[index] = entry.getValue(); 
     index++; 
    } 
関連する問題