比较两个List<List<String>>
...
最后,我想知道它们是否包含相同的元素(true)或不包含(false)
我要比较这两个列表:
ObservableList<List<String>> fnlData = FXCollections.observableList(new LinkedList<>());;
List<List<String>> fnlDataTMP = new LinkedList<>();
我在论坛中搜索已经回答的问题,但没有任何帮助我......
答案 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);
注意事项:
答案 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类型匹配。