【发布时间】:2016-10-10 10:06:31
【问题描述】:
我应该通读一个文件,将所有新单词添加到一个数组列表中,如果该单词已经在列表中,则增加一个计数器来计算它出现的次数。我读的很好,但是在将它们添加到列表时,它似乎忽略了检查单词是否已经在列表中并添加相同单词的倍数的部分。我有什么:
阅读方法:
public void read(String text) throws Exception{
File fileText = new File(text);
Scanner in = new Scanner(fileText);
while(in.hasNextLine()){
newWord = new Word(in.nextLine());
add(newWord.text);
}
}
添加到arraylist的方法
public void add(String text){
for(Word o: wordList){
if(wordList.contains(newWord.text){
newWord.increaseCount();
}else{
wordList.add(newWord);
}
}
非常感谢一些帮助,我完全不知道问题出在哪里......
【问题讨论】:
-
使用地图会更方便
-
Java 集合的“包含”方法依赖于它们包含的类型(在您的情况下为 Word.java)的“等于”和“哈希码”方法。如果这些方法没有从 Object 覆盖,它们将不会进行“语义”比较(这两个字符串是否相同),而是内存引用比较(这两个指针是否位于同一位置)。阅读有关 equals 和 hashcode 的更多信息,这将是有意义的。
-
顺便说一句:在您的 add 方法中,您遍历您的 wordlist 并为每次迭代执行包含检查 + 添加。因此,如果您的列表有 10 个元素大并且您调用 add 方法,则新值将被插入一次,然后计数器增加 9 倍。 (或者如果您的 Word 对象没有覆盖“equals”和“hashcode”正确,它将被插入 10 次)。您需要删除“for(Word o: wordList)”循环。无论如何,您都不使用“o”对象。所以这是一种毫无意义的迭代。
-
另外,您的 add 方法接受一个参数“Sting text”,然后绝对不使用它。这不可能是正确的。