Java 获取两个arrayList之间的差异,但以大写字母进行比较

Java 获取两个arrayList之间的差异,但以大写字母进行比较,java,arraylist,groovy,Java,Arraylist,Groovy,我有两个arrayList,我需要比较它们,得到唯一的值,并用它们构建一个新的数组,问题是有些值是相同的,但大写,所以它们不应该显示为唯一值。这是我的代码alredy,可以工作,但速度会变慢 for (i = 0; i < parsedLocal.size(); i++) { for (j = 0; j < parsedRemote.size(); j++) { if (parsedLocal[i].toUpperCase().equals(parsedRemote[j

我有两个arrayList,我需要比较它们,得到唯一的值,并用它们构建一个新的数组,问题是有些值是相同的,但大写,所以它们不应该显示为唯一值。这是我的代码alredy,可以工作,但速度会变慢

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])
    }
  }
}
使用java 8可以很容易,如下所示:

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

下面的groovy代码应该计算差异(请注意,返回的集合将包含大写值):

但您也可以使用基于流的计算。这具有稍高的空间复杂度,但应具有线性时间复杂度:

Set<String> set1 = parsedLocal.stream()
        .map{it.toUpperCase()}
        .collect(Collectors.toSet());
List<String> retained = parsedRemote.stream()
        .filter{!set1.contains(it.toUpperCase())}
        .collect(Collectors.toList());
Set set1=parsedLocal.stream()
.map{it.toUpperCase()}
.collect(收集器.toSet());
保留列表=parsedRemote.stream()
.filter{!set1.contains(it.toUpperCase())}
.collect(Collectors.toList());

是全大写还是全小写?或者也有混合情况?混合情况下,一些值的编写方式类似于Jhon,例如Jhon。您可以将所有列表转换为大写或小写,然后调用parsedLocal.removeAll(parsedRemote)@好的,有没有一种方法可以在不迭代的情况下将它们转换为大写或小写?你必须迭代。然而,流的速度要快一点。strings.stream().map(String::toLowerCase.collect(Collectors.toList());此外,这将删除嵌套循环,该循环速度慢得多。尝试在tmpList.removeIf行启动失败时获取错误:Script1.groovy:8:意外标记:->@line 8,第30列。tmpList.removeIf((t)->t.equalsIgnoreCase(s));^1不支持错误lambda?不使用java 8?@CristianGonzalez如果这不是java代码,你应该用
groovy
标记你的问题。@Hearen openjdk版本“1.8.0_111”@Hearen问题是代码被编译为groovy代码。当然,所使用的groovy版本不支持java lambda语法。
[bb]
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());