Java:如何有效地从第二个数组中不存在的数组中删除字符串?

时间:2014-12-03 23:14:48

标签: java arrays performance

我有两个大的字符串数组。我想从第一个数组中删除第二个数组中不存在的元素。 首先,我创建了两个数组:

要修改的数组

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

然后我创建Iterator来遍历items数组的元素并检查迭代项是否存在于filter数组中,如果存在,则将其从items中删除:

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

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

items数组包含286,568个字符串,filter包含100,000个字符串。看来这个操作需要花费太多时间,所以我没有高效地完成它。 有更快的方法吗?

2 个答案:

答案 0 :(得分:6)

只需使用不同的集合类型。对于过滤器,请使用HashSet O(1)O(n)的{​​{1}}个)搜索复杂度,对于项目,请使用ArrayList代替{{1} - 这对删除操作更有效。

我没有测试过这段代码,但是......

LinkedList

答案 1 :(得分:3)

如果您经常为大型馆藏致电collection.contains(element),则不应使用ArrayList,而应使用HashSet

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

HashSet是用于查找内容的优化数据结构。