我正在编写一个学习arraylists的程序。基本上它的作用是从一个字符串数组(每个单词)中提取并找到使用并行arraylists的重复项。有两个arraylists用于单词,一个用于每个单词出现的次数。单词列表的第0个点中的单词对应于计数列表的第0个点中的数字,依此类推。我成功地找到了重复的单词并计算了它们的出现次数,但是对于只出现一次的单词,我得到的数量为2,而我似乎无法找出原因。这是代码
String[] wordList = fileContents.split("\\s");
ArrayList<String> words = new ArrayList<String>();
ArrayList<Integer> counts = new ArrayList<Integer>();
words.add(wordList[0]);
counts.add(0);
for (int i = 0; i < wordList.length; i++) {
String tempWord = wordList[i];
boolean foundEqual = false;
int count = 0;
for(int q = 0;q < words.size();q++) {
if (tempWord.equals(words.get(q))) {
foundEqual = true;
counts.add(q, counts.get(q) + 1);
}
}
if(!foundEqual){
words.add(tempWord);
counts.add(1);
}
}
for (int i = 0; i < words.size(); i++) {
System.out.println(words.get(i) + ":" + counts.get(i));
}
以下是单词
this is a test
this is also a test
this is the last test
这里是输出,你可以看到最后三项应该是1但是是2.
this:3
is:3
a:2
test:3
also:2
the:2
last:2
任何帮助都会非常感激!
答案 0 :(得分:3)
在print语句之前的调试器中查看counts
和words
的结构时,很明显有些不妥。
words: counts 0 = this 0 = 3 1 = is 1 = 3 2 = a 2 = 2 3 = test 3 = 3 4 = also 4 = 2 5 = the 5 = 2 6 = last 6 = 2 7 = 1 8 = 0 9 = 1 10 = 1 11 = 1 12 = 1 13 = 1 14 = 1
问题是ArrayList中的add语句。来自Javadocs:
将指定元素插入此列表中的指定位置。 移动当前位于该位置的元素(如果有)和任何元素 右边的后续元素(在索引中加一个)。
因此,每次执行counts.add(q, counts.get(q) + 1)
时,您都会在列表中插入另一个元素。您应该使用set
。
在for
上设置断点并通过调试器(eclipse debugging tutorial运行)我可以看看每个阵列都在增长:
words: counts 0 = this 0 = 0
这是第一点:
words.add(wordList[0]);
counts.add(0);
当它再次点击for循环时:
words: counts 0 = this 0 = 1 1 = 0
发生的事情是counts.add(0,1)
在第0个位置放置了1,然后将数组中的其他所有内容都移了。
经过几次迭代后,我们再次回到这里。
words: counts 0 = this 0 = 1 1 = is 1 = 0 2 = a 2 = 1 3 = test 3 = 1 4 = 1
然后再次匹配'this':
words: counts 0 = this 0 = 2 1 = is 1 = 1 2 = a 2 = 0 3 = test 3 = 1 4 = 1 5 = 1
你应该能够看到这种结构如何不正确地增长。
答案 1 :(得分:1)
除此之外:您的主循环应该从i = 1
开始,因为在循环开始之前覆盖了i = 0
。
错误在于你计算每次后续旅行中的第一次出现。将q = 0
更改为q = i + 1
以避免这种情况。
您还必须检查您的最终条件。