java如何验证arraylist中是否存在具有特定属性值的对象?
我希望通读文本文档,然后只将唯一的单词添加到“Word”对象的arraylist中。我现在的代码似乎根本没有在wordList arraylist中输入任何单词
public ArrayList<Word> wordList = new ArrayList<Word>();
String fileName, word;
int counter;
Scanner reader = null;
Scanner scanner = new Scanner(System.in);
try {
reader = new Scanner(new FileInputStream(fileName));
}
catch(FileNotFoundException e) {
System.out.println("The file could not be found. The program will now exit.");
System.exit(0);
}
while (reader.hasNext()) {
word = reader.next().toLowerCase();
for (Word value : wordList) {
if(value.getValue().contains(word)) {
Word newWord = new Word(word);
wordList.add(newWord);
}
}
counter++;
}
public class Word {
String value;
int frequency;
public Word(String v) {
value = v;
frequency = 1;
}
public String getValue() {
return value;
}
public String toString() {
return value + " " + frequency;
}
}
# 1 楼答案
好的,让我们从修复当前代码开始。您遇到的问题是,仅当列表中已经存在一个新的word对象时,才将其添加到列表中。相反,当不存在单词对象时,需要添加一个新单词对象,否则需要增加频率。下面是一个修复示例:
然而,这是一个非常糟糕的解决方案(O(n^2)运行时)。相反,我们应该使用称为Map的数据结构,这将使我们的运行时降到(O(n))
# 2 楼答案
for-each循环正在
wordList
上迭代,但这是一个空的ArrayList,因此代码永远不会到达wordList.add(newWord);
行# 3 楼答案
我很感激,也许你想对你的算法不起作用的原因提出批评,或者这是一个更大问题的例子,但如果你想做的只是计算发生次数,有一种更简单的方法
使用Java8中的Streams,您可以将其归结为一种方法—在文件中创建
Stream
行,将它们小写,然后使用Collector
对它们进行计数到目前为止,我还没有对
Streams
做过任何事情,所以欢迎任何批评