[英]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);
注意事项:
如果相同的元素你的意思是两个列表是相同的但是以不同的顺序,那么我建议你对列表进行排序,然后比较它们。
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.