2014-12-03 13 views
1

我有兩個大的字符串數組。我想從第一個數組中刪除第二個數組中不存在的元素。 首先創建兩個數組:Java:如何有效地從數組中刪除不存在於第二個數組中的字符串?

陣列修改

String[] sarr = fdata.split(System.getProperty("line.separator")); 
ArrayList<String> items = new ArrayList(Arrays.asList(sarr)); 

器陣列

List<String> filter = new ArrayList<String>(); 
filter = Arrays.asList(voc.split(System.getProperty("line.separator"))) 

然後,我創建迭代通過items數組中的元素進行迭代,並檢查迭代項是否存在於filter陣列中,如果存在,則將其從items中刪除:

Iterator<String> it = items.iterator(); 

while (it.hasNext()) { 
    String s = it.next(); 
    if (!filter.contains(s)) { 
     it.remove(); 
    } 
} 

items陣列包含286568個字符串和filter包含10萬串。看起來該操作花費了太多時間,所以我沒有有效地進行操作。 有更快的方法嗎?

回答

6

只使用不同的集合類型。對於過濾器,使用HashSetO(1)(用於ArrayListO(n) instad)搜索的複雜性,併爲項目,使用LinkedList代替ArrayList - 這將是刪除操作更有效率。

我沒有測試此代碼,但是...

String[] sarr = fdata.split(System.getProperty("line.separator")); 
LinkedList<String> items = new LinkedList(Arrays.asList(sarr)); 

Set<String> filter = new HashSet<String>(); 
filter = new HashSet(Arrays.asList(voc.split(System.getProperty("line.separator")))); 
items.retainAll(filter); 
+0

哇,那太快了! – minerals 2014-12-03 23:37:47

+0

它甚至可以更快一點,這取決於你想要達到的目標;只要你不關心項目順序或重複值,你也可以使用'HashSet'作爲項目。 – Elist 2014-12-03 23:41:24

+0

@minerals重要的是要了解基本數據結構以瞭解爲什麼它更高效 – Dici 2014-12-03 23:49:39

3

當你經常打電話collection.contains(element)的大集合,你不應該使用一個ArrayList,而是HashSet

Set<String> filter = new HashSet<>(); 
Collections.addAll(filter, voc.split(System.getProperty("line.separator"))); 

A HashSet是用於查找事物的優化數據結構。

相關問題