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

Java 为什么我的计数器在循环中递增,但返回零?,java,counter,class-variables,Java,Counter,Class Variables,在我当前的项目中,我必须在树映射中保留一个插入次数计数器。该项目将运行字符串中单个单词的搜索,在本例中为歌词。我有三个测试来确定地图插入的过程,我的算法是: 测试单词是否有多个字符且不是常用单词 如果map已经包含该单词作为键,则测试set是否已经包含该歌曲 如果为true,则递增插入计数器 如果映射不包含单词作为键 创建新节点,将歌曲添加到设置中 增量计数器 我声明计数器为私有双插入作为类变量 它在构造函数中初始化: public SearchByLyricsWords(SongCollect

在我当前的项目中,我必须在
树映射中保留一个插入次数计数器。该项目将运行字符串中单个单词的搜索,在本例中为歌词。我有三个测试来确定地图插入的过程,我的算法是:

  • 测试单词是否有多个字符且不是常用单词
  • 如果map已经包含该单词作为键,则测试set是否已经包含该歌曲
  • 如果为true,则递增插入计数器
  • 如果映射不包含单词作为键
    • 创建新节点,将歌曲添加到设置中
    • 增量计数器
我声明计数器为
私有双插入作为类变量

它在构造函数中初始化:

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
for(字符串字:currentlyps){
if(word.length()>1&&!commonWords.contains(word)){
if(抒情词.containsKey(词)){
if(!lyricWords.get(word).contains(song))
insertions++;//这是一首集合中不重复的歌曲
歌词。获取(单词)。添加(歌曲);
}否则{
TreeSet songSet=新TreeSet();
歌曲集。添加(歌曲);
歌词。放(词,歌曲集);
关键词:添加(word);
插入++;
}
//System.out.println(word+“添加”);
}
}//通过字符串结束循环

为什么在一个方法中修改的类变量没有在另一个方法中给出正确的值?

调用buildsongmap函数后,似乎正在将变量设置为零。

调用buildsongmap函数后,似乎正在将变量设置为零。

请重试

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


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

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

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

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

为什么在构建歌曲映射后重置计数器?并不是说它可以解决问题,而是为什么
插入
声明为
双精度
?当然这应该是一个整数…因为在这个项目开始时,我不知道地图上会添加多少单词。该项目让我们阅读了10500多首歌词完整的歌曲。我不知道总插入量是否会大于整数的容量,因此
double
long-8字节有符号(2的补码)。范围从-9223372036854775808到+9223372036854775807。涉及双精度的比较非常重要,请为计数器使用整数类型。为什么在构建歌曲映射后重置计数器?这并不是说它可以解决问题,而是为什么插入被声明为双精度?当然这应该是一个整数…因为在这个项目开始时,我不知道地图上会添加多少单词。该项目让我们阅读了10500多首歌词完整的歌曲。我不知道总插入量是否会大于整数的容量,因此
double
long-8字节有符号(2的补码)。范围从-9223372036854775808到+9223372036854775807。涉及双精度的比较非常重要,请为计数器使用整数类型。将计数器声明为双精度似乎也很奇怪,正如Mark E所指出的。将计数器声明为双精度似乎也很奇怪,正如Mark E所指出的