1

私の現在のプロジェクトでは、への挿入数のカウンターを保持する必要がありTreeMap<String, TreeSet<Song>>ます。このプロジェクトでは、文字列内の個々の単語(この場合は歌詞)の検索を実行します。マップ挿入のコースを決定するための3つのテストがあり、アルゴリズムは次のようになります。

  • 単語に複数の文字があり、一般的な単語ではないかどうかをテストします
  • マップにすでに単語がキーとして含まれている場合は、セットにすでに曲が含まれているかどうかをテストします
  • trueの場合、挿入カウンターをインクリメントします
  • マップにキーとして単語が含まれていない場合
    • 新しいノードを作成し、設定する曲を追加します
    • インクリメントカウンター

カウンターをprivate double insertions;クラス変数として宣言します。

コンストラクターで初期化されます。

public SearchByLyricsWords(SongCollection sc) {
    this.songs= sc.getAllSongs();
    buildSongMap();
    insertions=0;
    totalReferences=0;
    averageReferences=0;
}  

buildMapメソッド:

for (String word:currentLyrics) {
    if (word.length()>1 && !commonWords.contains(word)) {
        if (lyricWords.containsKey(word)) {
            if (!lyricWords.get(word).contains(song))
                insertions++; //this is a non-duplicate song in the set
            lyricWords.get(word).add(song);

        } else {
            TreeSet<Song> songSet= new TreeSet<Song>();
            songSet.add(song);
            lyricWords.put(word, songSet);
            keyWords.add(word);
            insertions++;
        }
        //System.out.println(word+" added");
    }
} //end loop through string

メソッドで変更されたクラス変数が、別のメソッドで正しい値を与えないのはなぜですか?

4

3 に答える 3

3

buildsongmap関数を呼び出した直後に変数をゼロに設定しているようです。

于 2010-11-06T15:50:08.397 に答える
3

試す

public SearchByLyricsWords(SongCollection sc) {
    this.songs= sc.getAllSongs();
    insertions=0;
    totalReferences=0;
    averageReferences=0;
    buildSongMap();
}  
于 2010-11-06T15:52:58.007 に答える
2

すでに述べたように、それはコンストラクターでの初期化の問題です。もう1つ、buildSongMapメソッドでは、曲がすでに含まれているかどうかに関係なく、曲をマップに追加します。重複を防ぐセットを使用していますが、まだ存在しない場合にのみ追加を実行する方が読みやすいと思います。

if (!lyricWords.get(word).contains(song)) {
  insertions++;
  lyricWords.get(word).add(song);
}
于 2010-11-06T15:57:43.897 に答える