首页 > 解决方案 > 如何检查列表是否存在于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



    }

标签: java

解决方案


您的 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());

推荐阅读