2011-10-12 4 views
0

私は単語とその頻度を保持するためにsplaytreeを実装しており、各単語頻度を保持するPairクラスを作成することを選択しました値)ペア。すなわち、splaytreeの各ノードはペアのペアを保持する。一般的なPairクラスとSplaytreeを使って単語とその頻度をJavaでカウントして保存する

public class SplayEntry<K, V> implements Comparable<SplayEntry<K, V>>{ 

public K word; 
public V frequency; 

public SplayEntry(K word, V frequency) { 
    this.word = word; 
    this.frequency = frequency; 
} 
getters, setters, hashCode, equals, compareTo etc... 

スプレー木::

public class SplayTree<AnyType extends Comparable<? super AnyType>> { 

public SplayTree() 
{ 
    nullNode = new BinaryNode<AnyType>(null); 
    nullNode.left = nullNode.right = nullNode; 
    root = nullNode; 
} 

そしてBinaryNodeクラスを持つペアクラスは次のようになります。

私が問題を抱えているのは、すべての単語と周波数のペアがツリーに配置され、そのペアがすでに存在するかどうかを確認することです。

public void countWords(String line) { 
    line = line.toLowerCase(); 
    String[] words = line.split("\\P{L}+"); 
    SplayEntry<String, Integer> entry = new SplayEntry<String, Integer>(null, null); 
    for (int i = 0, n = words.length; i < n; i++) { 
     Integer occurances = 0; 
     entry.setWord(words[i]); 
     entry.setFrequency(occurances); 

     if (tree.contains(entry.equals(entry)) && entry.getFrequency() == 0) { 
      occurances = 1; 

     } else { 
      int value = occurances.intValue(); 
      occurances = new Integer(value + 1); 
      entry.setFrequency(occurances); 
     } 

     entry = new SplayEntry<String, Integer>(words[i], occurances); 
     tree.insert(entry); 
    } 
} 

私はこれは本当に動作していない知っていると私は把握して助けを必要とする:私は、今の混乱である()メソッドcountWordsを行うラインで、テキストファイルの行を読み込み、単語に各ラインを分割しましたどのようにSplayEntryクラスをどのようにインスタンス化する必要がありますか?また、単語配列のすべての単語について、ツリー(包含)内のSplayEntryに存在するかどうかをチェックし、単語が新しい単語の場合は頻度が1になり、そうでない場合は頻度が+1する。最後に、新しいSplayEntryをSplaytreeに追加し、それを適切なノードに配置させます。

今のところ、同じコードを必要以上に処理することが混乱しています。私は正しい方向に私を導くポインタを非常に感謝しています。

ありがとうございます。私が自分自身を明確にしていないかどうか教えてください。

+0

hashCode()を実装しましたか? – JustinKSU

+0

forループの先頭に新しいエントリを作成します(その前ではありません)。新しいエントリを作成するのではなく、前のエントリを更新しているようです。 – JustinKSU

+0

私は確かに変更可能なエントリを使うことを検討し、毎回新しい 'SplayEntry'を作成しません。つまり、あなたは 'splay = tree.get();のようなコードを書くでしょう。 if splay == null tr​​ee.insert(new SplayEntry ...)else splat.add(value + 1)or so'。 – Gray

答えて

1

スプレイツリーの標準的な実装を使用することをお勧めします。つまり、カウンタを使用せずに、周波数ごとに別のHashMapを使用することをお勧めします。これは、スプレイツリーの操作がO(log n)であり、HashMapの操作がO(1)であるため、複雑さを犠牲にしません。カプセル化と不変量を保持するには、必要な操作を公開するより大きなクラスに両方を入れることができます。

+0

これは興味深い提案です。たとえば、Splaytreeのインスタンスに各ノード(重複はありますか?)、そしてsとその頻度(count)の組を持つ通常のHashMapを作成します。次に、ハッシュマップのキーと各ノード内の要素(単語)を比較して、一致、右? – Snorkelfarsan

+0

実際には、あなたの要素がハッシュ可能な場合は、 'HashMap'だけを使うこともできます。私はあなたの要素がハッシュ可能ではないが、匹敵するときにのみスプレイツリーを使いたいと思う。 –

+0

このプログラムの実装にはSplaytreeを使用する必要があります。すでにMap実装があります。 – Snorkelfarsan

関連する問題