在我目前的项目中,我必须将插入次数计入TreeMap<String, TreeSet<Song>>
。该项目是在字符串中搜索单个单词,在本例中是歌词。我有三个测试来确定地图插入的过程,我的算法是:
我将计数器声明为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
为什么在方法中修改了一个类变量,而不是在另一个方法中给出正确的值?
答案 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);
}