代码之家  ›  专栏  ›  技术社区  ›  Cristian Gonzalez

获取两个arraylist之间的差异,但以大写形式进行比较

  •  1
  • Cristian Gonzalez  · 技术社区  · 6 年前

    我有两个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);
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   ernest_k    6 年前

    以下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());
    
        2
  •  1
  •   Hearen    6 年前

    使用 removeIf 在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);
    

    以及输出:

    [bb]