为什么我在使用 == 比较两个排序数组列表的元素时没有得到想要的结果

问题描述 投票:0回答:1

我想从两个排序数组列表 list1 和 list2 中创建一个公共元素的新数组列表 我使用“==”运算符并得到错误的答案我使用“.equals()”运算符并得到正确的答案。

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

列表1 = [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, 1 40、 141, 145, 147, 148, 151, 152, 153, 154, 158, 159, 161, 163, 164, 165, 168, 169, 170, 172, 175, 176, 178, 179, 180, 181, 1 83、 184, 185, 186, 187, 188, 190, 191, 193, 194, 195, 196, 199, 200, 201, 203, 205, 206, 208, 209, 210, 211, 212]

列表2 = [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, 1 40、 141, 145, 147, 148, 151, 152, 153, 154, 158, 159, 161, 163, 164, 165, 168, 169, 170, 172, 175, 176, 178, 179, 180, 181, 1 83、 184, 185, 186, 187, 188, 190, 191, 193, 194, 195, 196, 199, 200, 201, 203, 205, 206, 208, 209, 210, 211, 212]

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

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

 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);

错误答案

最后得到的列表为 列表 = [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);

正确答案

我得到的列表为 列表 = [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 comparison operators sortedlist
1个回答
0
投票

Java

ArrayList
或其他
Collection
类型只能保存对象。它们不能保存基元。为了解决这个限制,使用了原始包装类。因此,
ArrayList<int> foo;
将产生编译器错误。但是,
ArrayList<Integer> foo;
很好。

由于

Integer
是一个对象,所以这行
if (list1.get(i)==list2.get(j))
正在询问“
list.get(i)
list2.get(j)
是同一个引用吗?”,就像
if (bar == bin)
询问
bar
bin
是否是同一个引用一样(即同一个对象)。

但是,使用原始包装类,可以自动装箱和自动拆箱。当编译器看到类似

int square = list1.get(i) * list1.get(i)
的内容时,就会隐式调用
list.get(i).intValue()
。在大多数情况下,这允许您将
Integer
对象视为
int
。但是,使用
==
!=
不是其中两个。

但是,

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

您不能将

>
<
<=
>=
与引用一起使用。因此,当编译器看到
if (list1.get(i)>list2.get(j))
时,就会使用自动拆箱。您也不允许对引用使用算术。因此,当编译器看到
if (list1.get(i)-1==(list2.get(j))-1)
时,也会使用自动拆箱。

© www.soinside.com 2019 - 2024. All rights reserved.