2014-12-03 12 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是用于查找事物的优化数据结构。

相关问题