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

时间:2015-07-29 10:52:48

标签: java list compare

比较两个List<List<String>> ...

的字符串元素的最佳方法是什么

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

我要比较这两个列表:

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

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

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

7 个答案:

答案 0 :(得分:2)

如果两个列表都按顺序

,请尝试fnlData.equals(fnlDataTMP)

或者如果顺序无关紧要,请尝试创建哈希集,然后使用等于

进行比较
new HashSet(fnlData).equals(new HashSet(fnlDataTMP))

答案 1 :(得分:1)

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

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相等,则检查最终的差异

答案 2 :(得分:1)

我认为没有办法可以让你实现开箱即用。

您可以使用functional 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”作为元素,这将标记为相等。根据您的情况,这可能是无关紧要的 - 如果这是相关的,我看不到围绕嵌套循环的方法。

答案 3 :(得分:1)

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

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

我还没测试过它!

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

示例代码:

RIGHT JOIN

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

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

答案 6 :(得分:0)

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