Java ArrayList包含的方法不起作用

时间:2017-05-25 01:45:42

标签: java arrays arraylist

因此,当我运行此程序时,它显示了ArrayList" test"在变量"位置"中没有包含数组[5,6]。当我检查输出时,它显然在那里,我看到"测试"确实包含该元素。

输出:

  

[5,6]   [5,6]   假

代码:

package arraylisttest;

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListTest {
    public static void main(String[] args) {
        int[] position = { 5, 6 };
        ArrayList<int[]> test = new ArrayList<>();

        test.add(new int[] {50, 2});
        test.add(new int[] {0, 7});
        test.add(new int[] {5, 6});
        test.add(new int[] {2, 1});

        System.out.println(Arrays.toString(position));
        System.out.println(Arrays.toString(test.get(2)));
        System.out.println(test.contains(position));
    }
}

3 个答案:

答案 0 :(得分:3)

我相信List.contains()将使用equals()方法来确定列表是否包含给定对象(q.v. source code for ArrayList#contains())。它不会比较每个2D阵列中的两个点以查看它们是否相同。因此,尽管点{5, 6}逻辑上出现在列表中,但它与用于比较的position不同,因此比较失败。

请注意,以下代码的行为符合您的预期:

int[] position = { 5, 6 };
ArrayList<int[]> test = new ArrayList<>();
test.add(new int[] {50, 2});
test.add(new int[] {0, 7});
test.add(position);
test.add(new int[] {2, 1});

System.out.println(Arrays.toString(position));
System.out.println(Arrays.toString(test.get(2)));

System.out.println(test.contains(position));

答案 1 :(得分:2)

这里的问题是数组覆盖Object#equals方法,因此你接收的输出;相反,您可以创建ArrayLists的ArrayList,例如下面的代码将输出 true

ArrayList<Integer> position = new ArrayList<>(Arrays.asList(5, 6));
ArrayList<ArrayList<Integer>> test = new ArrayList<>();
ArrayList<Integer> y = new ArrayList<>(Arrays.asList(5,6));
test.add(y);
System.out.println(test.contains(position));

另一种选择是保持当前的解决方案,但使用流来对列表中的其他数组进行比较:

System.out.println(test.stream().anyMatch(e -> Arrays.equals(e,position)));

答案 2 :(得分:0)

数组只能与Arrays.equals()进行比较。

您应该使用ArrayList:

ArrayList<Integer> position = new ArrayList<Integer>(Arrays.asList(5, 6));

ArrayList<ArrayList<Integer>> test = new ArrayList<>();
test.add(new ArrayList<>(Arrays.asList(50, 2)))
test.add(new ArrayList<>(Arrays.asList(0, 7)));
test.add(new ArrayList<>(Arrays.asList(5, 6)));
test.add(new ArrayList<>(Arrays.asList(2, 1)));


System.out.println(test.contains(position));