我有两个大的字符串数组。我想从第一个数组中删除第二个数组中不存在的元素。 首先,我创建了两个数组:
要修改的数组:
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个字符串。看来这个操作需要花费太多时间,所以我没有高效地完成它。
有更快的方法吗?
答案 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
是用于查找内容的优化数据结构。