有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在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



    }

共 (2) 个答案

  1. # 1 楼答案

    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());
    
  2. # 2 楼答案

    你的比较仪坏了。单独测试:忘记树集,用测试数据创建List<Integer>对象,然后运行comparator.compare(a, b)并调试它。在两个列表共享的所有索引中循环的循环总是返回,这意味着它永远不会真正循环:它在第一个数字上运行一次(在您的示例中,两个列表的第一个数字都是^{),并返回一个值

    假设,如果值相等,您确实不想return 0,而是continue;。或者让for循环自然地运行到它的末端支架(所以两个If:如果较小,返回-1。如果较大,返回+1。就是这样——剩下的情况(它们相等)将循环