事实上,关于问题中的标题,我有一个解决方案,但我的方法似乎浪费资源来创建一个List对象。
所以我的问题是:我们有更有效的方法吗?
从案例中,我想从Vector中删除额外的空格“”和额外的“a”。
我的矢量包括:
{"a", "rainy", " ", "day", "with", " ", "a", "cold", "wind", "day", "a"}
这是我的代码:
List lt = new LinkedList();
lt = new ArrayList();
lt.add("a");
lt.add(" ");
vec1.removeAll(lt);
正如您可以在Vector
列表中看到额外的空格,发生的原因是我使用Vector
来读取word文档中的单词并将其分块,有时文档可能包含一些由人为错误引起的额外空间。
答案 0 :(得分:0)
您当前的方法确实遇到了从Vector
删除元素是O(N)
操作的问题......您可能会执行此操作M次(在您的示例中为5)。
假设您有多个“停用词”并且您可以更改数据结构,这里的版本应该(理论上)更有效:
public List<String> removeStopWords(
List<String> input, HashSet<String> stopWords) {
List<String> output = new ArrayList<String>(input.size());
for (String elem : input) {
if (!stopWords.contains(elem)) {
output.append(elem);
}
}
return res;
}
// This could be saved somewhere, assuming that you are always filtering
// out the same stopwords.
HashSet<String> stopWords = new HashSet<String>();
stopWords.add(" ");
stopWords.add("a");
... // and more
List<String> newList = removeStopwords(list, stopWords);
注意事项:
以上创建了一个新列表。如果必须重用现有列表,请清除它,然后addAll
新列表元素。 (另一个O(N-M)
步骤......如果你不需要,那就不要了。)
如果有多个停用词,则使用HashSet会更有效;例如如果按上述方式完成。我不确定收支平衡点的确切位置(与使用List相比),但我怀疑它是2到3个停用词。
上面创建了一个新列表,但它只复制了N - M
个元素。相比之下,应用于removeAll
的{{1}}算法可以复制Vector
元素。
除非需要线程安全的数据结构,否则不要使用O(NM)
。 Vector
具有类似的内部数据结构,并且不会在每次调用时产生同步开销。