为什么我在使用 == 比较两个 SORTED arraylist [duplicate] 的元素时没有得到想要的结果

Why I not am getting desired result while using == to compare elements of two SORTED arraylist [duplicate]

提问人:Robot.. 提问时间:10/15/2023 最后编辑:Robot.. 更新时间:10/15/2023 访问量:37

问:

我想从两个 SORTED ARRAYLIST list1 和 list2 中为公共元素创建一个新的 Arraylist 我使用“==”运算符并得到错误的答案,我使用“.equals()”运算符并得到正确的答案。

我的问题是如果==正确不能检查ARRAYLIST的元素。 那么为什么我的答案列表不是空的,为什么其中存在一些元素。 为什么它正确检查了某些元素,然后又无法进一步检查它们。

list1 = [1, 2, 3, 7, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 31, 33, 35, 36, 37, 38, 41, 42, 45, 46, 47, 49, 50, 51, 53, 55, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 85, 87, 88, 90, 91, 92, 94, 95, 96, 97, 100, 102, 103, 104, 109, 110, 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, 125, 126, 129, 130, 132, 133, 137, 138, 139, 140, 141, 145, 147, 148, 151, 152, 153, 154, 158, 159, 161, 163, 164, 165, 168, 169, 170, 172, 175, 176, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 190, 191, 193, 194, 195, 196, 199, 200, 201, 203, 205, 206, 208, 209, 210, 211, 212]

list2 = [1, 2, 3, 7, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 31, 33, 35, 36, 37, 38, 41, 42, 45, 46, 47, 49, 50, 51, 53, 55, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 85, 87, 88, 90, 91, 92, 94, 95, 96, 97, 100, 102, 103, 104, 109, 110, 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, 125, 126, 129, 130, 132, 133, 137, 138, 139, 140, 141, 145, 147, 148, 151, 152, 153, 154, 158, 159, 161, 163, 164, 165, 168, 169, 170, 172, 175, 176, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 190, 191, 193, 194, 195, 196, 199, 200, 201, 203, 205, 206, 208, 209, 210, 211, 212]

list = [] --->答案列表

使用“==”运算符--->代码

 while (i < list1.size() && j < list2.size()) {
            if (list1.get(i)==list2.get(j)) {
                list.add(list1.get(i));
                i++;
                j++;
            } else if (list1.get(i)>list2.get(j)) {
                j++;
            } else {
                i++;
            }
        }
        System.out.println(list);

ANS 不正确

终于得到了列表 列表 = [1, 2, 3, 7, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 31, 33, 35, 36, 37, 38, 41, 42, 45, 46, 47, 49, 50, 51, 53, 55, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 85, 87, 88, 90, 91, 92, 94, 95, 96, 97, 100, 102, 103, 104, 109, 110, 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, 125, 126]

使用“.equals()”运算符--->代码

while (i < list1.size() && j < list2.size()) {
            if (list1.get(i).equals(list2.get(j))) {
                list.add(list1.get(i));
                i++;
                j++;
            } else if (list1.get(i)>list2.get(j)) {
                j++;
            } else {
                i++;
            }
        }
        System.out.println(list);

正确的 ANS

我得到的清单是 列表 = [1, 2, 3, 7, 8, 9, 10, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 26, 27, 28, 30, 31, 33, 35, 36, 37, 38, 41, 42, 45, 46, 47, 49, 50, 51, 53, 55, 57, 58, 59, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 85, 87, 88, 90, 91, 92, 94, 95, 96, 97, 100, 102, 103, 104, 109, 110, 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, 125, 126, 129, 130, 132, 133, 137, 138, 139, 140, 141, 145, 147, 148, 151, 152, 153, 154, 158, 159, 161, 163, 164, 165, 168, 169, 170, 172, 175, 176, 178, 179, 180, 181, 183, 184, 185, 186, 187, 188, 190, 191, 193, 194, 195, 196, 199, 200, 201, 203, 205, 206, 208, 209, 210, 211, 212]

注意:主要问题是,如果“==”不是这个程序的合适运算符,为什么我没有得到完全空的列表,为什么我在列表中得到一些元素,为什么循环在中途终止。

也用于

使用 ---> “==” 但使用 -1 的代码;

   while (i < list1.size() && j < list2.size()) {
            if (list1.get(i)-1==(list2.get(j))-1) {
                list.add(list1.get(i));
                i++;
                j++;
            } else if (list1.get(i)>list2.get(j)) {
                j++;
            } else {
                i++;
            }
        }
        System.out.println(list);
    }

有了这个代码,我得到了正确的答案

Java ArrayList 比较 运算符 sortedlist

评论

0赞 Slaw 10/15/2023
副本回答了您的大部分问题。至于为什么减法可以工作,那是因为结果是 ,而不是 ,并且与基元一起使用时会比较实际值,而不是与引用类型(例如,)一起使用时比较引用。1==intInteger==Integer
0赞 Elliott Frisch 10/15/2023
不应将引用类型与 进行比较。此外,现在是使用 Comparable 界面的好时机,例如 .==int comp = list1.get(i).compareTo(list2.get(j)); if (comp == 0) {} else if (comp > 0) {} else {}

答:

0赞 Old Dog Programmer 10/15/2023 #1

Java 或其他类型只能保存 Objects。他们不能持有原语。为了绕过此限制,使用了原始包装类。因此,将产生编译器错误。但是,很好。ArrayListCollectionArrayList<int> foo;ArrayList<Integer> foo;

由于 an 是一个对象,所以这一行问的是“Are and the same reference?”,就像问 if 和 are the same reference(即同一个 Object)一样。Integerif (list1.get(i)==list2.get(j))list.get(i)list2.get(j)if (bar == bin)barbin

但是,对于原始包装类,有自动装箱和自动取消装箱。当编译器看到类似 的东西时,会隐式调用。这允许您在大多数情况下将 Object 视为 。但是,使用或不是其中两个。int square = list1.get(i) * list1.get(i)list.get(i).intValue()Integerint==!=

但是,显式地告诉编译器您要比较值,而不是引用。if (list1.get(i).equals(list2.get(j)))

不能将 、 、 或 与引用一起使用。因此,当编译器看到 时,将使用自动拆箱。您也不允许在参考文献上使用算术。因此,当编译器看到 时,会导致使用自动拆箱。><<=>=if (list1.get(i)>list2.get(j))if (list1.get(i)-1==(list2.get(j))-1)-1