如何在java中检查列表是否存在于列表中
包含列表和自定义比较器的树集。我想检查列表是否存在于列表中,但此代码给出了错误的答案。任何人都可以通过适当的解释来解决这个问题,或者如何修改树集以获得正确的答案
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
}
# 1 楼答案
for循环不会执行一次以上的迭代:条件语句的所有三个分支都包含一个
return
语句所以,你要做的就是比较这两个列表的第一个元素
在最后一个例子中删除
return 0;
相反,您可能会发现将比较器主体写为:
按照建议编写现有代码(“您可能会发现它更整洁”),原始代码相当于:
# 2 楼答案
你的比较仪坏了。单独测试:忘记树集,用测试数据创建),并返回一个值
List<Integer>
对象,然后运行comparator.compare(a, b)
并调试它。在两个列表共享的所有索引中循环的循环总是返回,这意味着它永远不会真正循环:它在第一个数字上运行一次(在您的示例中,两个列表的第一个数字都是^{假设,如果值相等,您确实不想
return 0
,而是continue;
。或者让for循环自然地运行到它的末端支架(所以两个If:如果较小,返回-1。如果较大,返回+1。就是这样——剩下的情况(它们相等)将循环