繁体   English   中英

Java - 比较两个List的最佳方法 <List<String> &gt;?

[英]Java - best way to compare two List<List<String>>?

比较两个List<List<String>>的String元素的最佳方法是什么...

最后,我想知道它们是否包含相同的元素(true)或不包含(false)

这两个我要比较的列表:

ObservableList<List<String>> fnlData = FXCollections.observableList(new LinkedList<>());;

List<List<String>> fnlDataTMP = new LinkedList<>();

我在论坛中搜索了已经回答的问题,但没有任何帮助我...

如果两个列表都是有序的,请尝试fnlData.equals(fnlDataTMP)

或者如果顺序无关紧要,请尝试创建哈希集,然后使用equals进行比较

new HashSet(fnlData).equals(new HashSet(fnlDataTMP))

看起来你需要一个双重迭代

boolean checkEqual(List<List<String>> l1,List<List<String>> l2){
  if(l1.size() != l2.size()){
    return false;
  }
  if(l1.hashCode() != l2.hashCode()){
    return false;
  }
  for(int i=0; i<l1.size(); i++) {
    List<String> curr = l1.get(i);
    List<String> comp = l2.get(i);
    if(curr.size() != comp.size()){
      return false;
    }
    if(curr.hashCode() != comp.hashCode()){
      return false;
    }
    for(int j=0; j<curr.size(); j++) {
      if(!curr.get(j).equals(comp.get(j))){
        return false;
      }
    }
  }
  return true;
}

您可以改进解决方案,检查hashCode的第一个区别

if(l1.hashCode() != l2.hashCode()){
  return false;
}

如果hashCode相等,那么最终检查深度差异

我不认为有一种方法可以让你实现开箱即用。

您可以执行类似函数java List.join方法的操作来快速生成2个列表并进行比较:

List<String> joinedFnlData = jf.data.List.join(fnlData);
List<String> joinedFnlDataTMP = jf.data.List.join(fnlDataTMP);

CollectionUtils.isEqualCollection(joinedFnlData, joinedFnlDataTMP);

注意事项:

  • 这可能不是最便宜的操作 - 因此在时间紧迫的情况下不应该经常调用它(例如UI线程)
  • 它没有“真正的”等于 - 因为你必须像上面的答案那样做一个嵌套循环。 这将检查两个连接列表是否具有相同基数的相同元素:例如,如果fnlData有2个列表,其中“1”和“2”作为唯一元素,fnlDataTMP有1个列表,其中“1”,“2”作为元素,这将标志着两者是平等的。 根据您的情况,这可能是无关紧要的 - 如果这是相关的,我没有看到围绕嵌套循环的方法。

如果相同的元素你的意思是两个列表是相同的但是以不同的顺序,那么我建议你对列表进行排序,然后比较它们。

boolean isEqual(List<String> list1, List<String> list2) {
        if (list1.size() != list2.size()) return false;
        Collections.sort(list1);
        Collections.sort(list2);
        int i = 0;
        for (String element : list1) {
            if (!element.equals(list2.get(i))) return false;
            i++;
         }
        return true;
    }

我还没测试过!

为了使集合(列表)相等,两者都需要是彼此的适当子集。 因此list1.containsAll(list2)list2.containsAll(list1) 对于List中的List,您必须循环,但这实际上是任何内置库必须要做的事情。

我想出了一个解决方案,它不需要有两个内部循环,使用Collections.sort(列表列表) ,它对List进行排序, List.containsAll(java.util.Collection) ,它比较两个列表为他们的元素。

示例代码:

    //Creating two lists for comparison and their inner lists
    List<List<String>> list1 = new LinkedList<>();
    List<List<String>> list2 = new LinkedList<>();

    LinkedList<String> l11 = new LinkedList<>();
    l11.add("a");
    l11.add("b");
    l11.add("c");

    LinkedList<String> l12 = new LinkedList<>();
    l12.add("d");
    l12.add("e");
    l12.add("f");

    LinkedList<String> l21 = new LinkedList<>();
    l21.add("b");
    l21.add("c");
    l21.add(new String("a"));

    LinkedList<String> l22 = new LinkedList<>();
    l22.add("d");
    l22.add("e");
    l22.add("f");

    list1.add(l11);
    list1.add(l12);
    list2.add(l22);
    list2.add(l21);

    for (List<String> list : list1){
        Collections.sort(list);
    }

    for (List<String> list : list2){
        Collections.sort(list);
    }

    System.out.println(list1.containsAll(list2) && list2.containsAll(list1)); //prints true

如果您不想更改内部列表中元素的顺序,则可以创建外部列表的副本并对其执行操作。

注意:这仅适用于可排序的集合。

将其中一个列表存储在HashMap中,然后遍历另一个列表并检查Map是否已包含该KEY。 当然,你必须确保KEY类型匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM