2011-09-26 194 views
0

实际上,对于问题中的标题,我有一个解决方案,但我的方法似乎浪费资源来创建List对象。如何从Vector中删除所有特定元素

所以我的问题是:我们有一个更有效的方法吗?

从案例中,我想从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文档中读取和分块单词,并且有时文档可能包含一些由人为错误引起的额外空间。

+2

为什么你使用'VECTOR'? – mrkhrts

+1

为什么不能在将字符串添加到矢量之前修剪(从中删除空格)?即从文档中读取并在放入矢量之前修剪字符串 – Scorpion

+1

以及我认为如果您的“特定元素”大小> 1,那么您需要另一个集合(在您的示例中为链接列表)。那么你当然可以迭代你的Vector,并且用if/else来检查元素并删除而不使用集合。对于你的问题,我认为更好的解决方案不是如何使用矢量,而是在将矢量添加到矢量之前。 – Kent

回答

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); 

点注意事项:

  • 上面创建一个新的列表。如果您不得不重新使用现有列表,请清除它,然后再使用新的列表元素。 (这是另一个O(N-M)步骤...所以如果你不必这样做。)

  • 如果有多个停用词,那么使用HashSet会更有效;例如如果按照上述完成。我不确定究竟是哪里的盈亏平衡点(与使用列表相比),但我认为这是2到3个停用词。

  • 上面创建一个新的列表,但它仅复制N - M元素。相比之下,removeAll算法应用于Vector时可以复制O(NM)元素。

  • 不要使用Vector,除非你需要需要一个线程安全的数据结构。 ArrayList具有类似的内部数据结构,并且不会导致每次调用的同步开销。

+0

根据你在做什么,如果你需要它是线程安全的,Vector可能是正确的解决方案。 – Chrispix

+1

@Chrispix - 我知道这一点。但是这个问题没有提到解决方案需要线程安全,并且在不需要的时候实现线程安全性对性能不利。请注意,该问题涉及性能优化。 –

相关问题