1

在我当前的项目中,我必须记录插入到TreeMap<String, TreeSet<Song>>. 该项目是在一个字符串中运行单个单词的搜索,在这种情况下是歌词。我有三个测试来确定地图插入的过程,我的算法是:

  • 测试单词是否有多个字符并且不是常用单词
  • 如果 map 已经包含该单词作为键,则测试 set 是否已包含该歌曲
  • 如果为真,则增加插入计数器
  • 如果地图不包含单词作为键
    • 创建新节点,添加歌曲设置
    • 递增计数器

我将计数器声明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

正如已经提到的,这是构造函数中的初始化问题。另一件事:在您的 buildSongMap 方法中,您将歌曲添加到地图中,无论它是否已经包含它。尽管您使用的是可以防止重复的 Set,但我认为仅在 add 已经不存在的情况下执行 add 更具可读性。

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