因此,当我运行此程序时,它显示了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));
}
}
答案 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));