有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有两个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])
    }
  }
}

然后我发现这个解决方案速度更快,但不比较大小写,你知道如何用这个方法或类似的方法来实现吗

parsedLocal.removeAll(parsedRemote);

共 (2) 个答案

  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]
    
  2. # 2 楼答案

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

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