我有两个arrayList,我需要比较它们,获取唯一的值并用它们构建一个新的数组,问题是有些值是相同的,但大写,因此不应将它们显示为唯一值。这是我的代码,可以正常工作,但是很慢
for (i = 0; i < parsedLocal.size(); i++) {
for (j = 0; j < parsedRemote.size(); j++) {
if (parsedLocal[i].toUpperCase().equals(parsedRemote[j].toUpperCase())){
parsedLocal.remove(parsedLocal[i])
}
}
}
然后,我发现此解决方案速度更快,但不比较大写或小写字母,是否有关于如何使用该方法或类似方法的想法?
parsedLocal.removeAll(parsedRemote);
答案 0 :(得分:2)
以下常规代码应计算差值(请注意,返回的集合将包含大写值):
parsedLocal*.toUpperCase() - parsedRemote*.toUpperCase()
但是您也可以使用基于流的计算。这具有稍微更高的空间复杂度,但应该具有线性时间复杂度:
Set<String> set1 = parsedLocal.stream()
.map{it.toUpperCase()}
.collect(Collectors.toSet());
List<String> retained = parsedRemote.stream()
.filter{!set1.contains(it.toUpperCase())}
.collect(Collectors.toList());
答案 1 :(得分:1)
在Java 8中使用removeIf很容易,如下所示:
List<String> parsedLocal = new ArrayList();
parsedLocal.add("aa");
parsedLocal.add("bb");
List<String> parsedRemote = new ArrayList();
parsedRemote.add("AA");
List<String> tmpList = new ArrayList<>(parsedLocal);
for (String s : parsedRemote) {
tmpList.removeIf((t) -> t.equalsIgnoreCase(s));
}
System.out.println(tmpList);
输出:
[bb]