java - 如何检查列表是否存在于java中的列表中
问题描述
包含列表和自定义比较器的 TreeSet。我想检查列表中是否存在列表,但这段代码给了我错误的答案。任何人都可以通过适当的解释或如何修改树集以获得正确答案来解决此问题,
public static void main(String[] args) {
//Creating TreeSet
TreeSet<ArrayList<Integer>> H = new TreeSet<ArrayList<Integer>>(new Comparator<ArrayList<Integer>>() {
//Implementing the comparotor
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
for (int i = 0; i < Math.min(o1.size(), o2.size()); ++i) {
//Checking the order of the number
if (o1.get(i) < o2.get(i)) {
return -1;
} else if (o1.get(i) > o2.get(i)) {
return 1;
} else {
return 0;
}
}
if (o1.size() == o2.size()) {
return 0;
}
if (o1.size() < o2.size()) {
return -1;
}
return 1;
}
});
ArrayList<Integer>A=new ArrayList<>();
A.add(1);
A.add(2);
A.add(3);
//Inserting the list in the treeset
H.add(A);
ArrayList<Integer>B=new ArrayList<>();
B.add(1);
B.add(2);
B.add(3);
B.add(4);
System.out.println(H.contains(B)); //This line is giving true
}
解决方案
您的 for 循环永远不会执行超过一次迭代:条件的所有三个分支都包含一条return
语句。
for (int i = 0; i < Math.min(o1.size(), o2.size()); ++i) {
//Checking the order of the number
if (o1.get(i) < o2.get(i)) {
return -1;
} else if (o1.get(i) > o2.get(i)) {
return 1;
} else {
return 0;
}
}
因此,您所做的只是比较两个列表的第一个元素。
return 0;
在最后一种情况下删除。
相反,您可能会发现将比较器主体编写为更简洁:
for (int i = 0; i < Math.min(o1.size(), o2.size()); ++i) {
int cmp = Integer.compare(o1.get(i), o2.get(i));
if (cmp != 0) {
return cmp;
}
}
return Integer.compare(o1.size(), o2.size());
按照建议编写现有代码(“您可能会发现它更整洁”),原始代码相当于:
if (!o1.isEmpty() && !o2.isEmpty()) {
return Integer.compare(o1.get(0), o2.get(0));
}
return Integer.compare(o1.size(), o2.size());
推荐阅读
- sqlite - 未遵守“ON DELETE RESTRICT”约束
- flutter - 如何从搜索结果导航到新页面
- powerbi - 如何下载报告 pbix 文件?
- javascript - 在 SharePoint 2013 页面中加载 gif
- node.js - 做写操作时出现Mongo错误301
- class - 在 Lua 类中使用表变量
- elasticsearch - Filebeat :数据路径已被另一个节拍锁定。请确保多个节拍不共享相同的数据路径
- javascript - 如果其他情况,我如何将标签值作为变量传递?
- python - PyQt5 自动调整 tkinter 窗口的大小
- flutter - Flutter bloc - 事件在 bloc 逻辑中仅被调用 2 次