为什么我的计数器在循环中递增,但返回零?

时间:2010-11-06 15:46:49

标签: java counter class-variables

在我目前的项目中,我必须将插入次数计入TreeMap<String, TreeSet<Song>>。该项目是在字符串中搜索单个单词,在本例中是歌词。我有三个测试来确定地图插入的过程,我的算法是:

  • 测试单词是否包含多个字符且不是常用字
  • 如果地图已经包含单词作为键,则测试set是否已包含歌曲
  • 如果为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

为什么在方法中修改了一个类变量,而不是在另一个方法中给出正确的值?

3 个答案:

答案 0 :(得分:3)

看起来你在调用buildsongmap函数后立即将变量设置为零。

答案 1 :(得分:3)

尝试

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

答案 2 :(得分:2)

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

if (!lyricWords.get(word).contains(song)) {
  insertions++;
  lyricWords.get(word).add(song);
}