正如标题所说,我有一个超过10000字的arraylist,我希望使用另一个单词的arraylist,我选择要搜索的单词。不能解释它比这更简单但是你可能会抓住我想要实现的代码。基本上,很多单词的一个arraylist然后是5个左右的单词的另一个arraylist,它将检查这些单词是否出现在长词的单词中。
//TO DO: Profile the search method
try {
Scanner input = new Scanner(new File("textFile.txt"));
int reps = 100;
List<String> list = new ArrayList();
List<String> searchValues = new ArrayList();
searchValues.add("You");
searchValues.add("and");
searchValues.add("So");
searchValues.add("we");
searchValues.add("important");
while (input.hasNext()) {
list.add(input.next());
}
input.close();
System.out.println("Amount of words in a .txt file: " + list.size());
//Start to time the method
long start = System.currentTimeMillis();
for (int i = 0; i < reps; i++) {
for (int j = 0; j < list.size(); j++) {
//List value = index.search(list.get(j));
List value = index.search(list.get(j));
}
}
long end = System.currentTimeMillis();
System.out.println("Time Taken: " + (end - start) + "ms");
} catch (IOException exc) {
System.out.println("File does not exist");
exc.printStackTrace();
System.exit(1);
}
答案 0 :(得分:3)
list.retainAll(searchValues)
将移除list
中不属于searchValues
的所有值。 (Javadoc)
答案 1 :(得分:1)
retainAll在内部调用contains(),它将迭代第二个列表,因此您可以获得O(n x m)时间复杂度搜索。
您可以使用散列图搜索单词,插入所有条目并查找多次出现的单词。这应该给你2 x O(n)+ O(m)。
但是,如果您的第二个列表只有5个对象,则可能无关紧要。
答案 2 :(得分:0)
您也可以使用:
list.stream().filter(s -> ! searchValues.contains(s));
这将返回一个由searchValues
列表中不存在的元素组成的流(考虑到您正在使用Java 8)。