在
Java中,从两个String数组返回公共元素最有效的方法是什么?我可以用一对for循环来做,但是似乎并不是非常有效.根据我对
similar SO question的评论,我可以想出的最好的办法就是转换为列表,然后应用retainAll
List<String> compareList = Arrays.asList(strArr1); List<String> baseList = Arrays.asList(strArr2); baseList.retainAll(compareList);
解决方法
编辑:
这是一个单行:
compareList.retainAll(new HashSet<String>(baseList));
retainAll impl(在AbstractCollection中)循环遍历,并在参数上使用contains().将参数转换为HashSet将导致快速查找,因此retainAll中的循环将尽可能快地执行.
此外,baseList的名称提示它是一个常量,所以如果您缓存此功能,您将获得显着的性能提升:
static final Set<String> BASE = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("one","two","three","etc"))); static void retainCommonWithBase(Collection<String> strings) { strings.retainAll(BASE); }
如果要保留原始列表,请执行以下操作:
static List<String> retainCommonWithBase(List<String> strings) { List<String> result = new ArrayList<String>(strings); result.retainAll(BASE); return result; }