我有一个两元素数组的列表,如下所示:
ArrayList<int[]> list = new ArrayList<int[]>();
我可以使用list.get()从这个列表中获取一个元素,但是尝试获取已知元素的索引不起作用:
int[] array = list.get(0); //returns an array
int index = list.indexOf(array); //returns -1
我正在使用Processing 3.2.1
我做错了什么?
答案 0 :(得分:0)
这将有效:
ArrayList<int[]> list = new ArrayList<int[]>();
list.add(new int[]{1, 2});
int[] array = list.get(0);
int index = list.indexOf(array);
println(index);
这不会:
ArrayList<int[]> list = new ArrayList<int[]>();
list.add(new int[]{1, 2});
int[] array = new int[]{1, 2};
int index = list.indexOf(array);
println(index);
indexOf()
函数使用equals()
函数来确定对象是否等于每个索引处的元素。不幸的是,数组的行为并不像您期望的那样,因此两个不同的数组相同的元素 不等于!
int[] arrayOne = {1, 2};
int[] arrayTwo = {1, 2};
println(arrayOne.equals(arrayTwo));
这是因为数组使用实例相等,所以如果数组是完全相同的数组,则它们是相等的!这就是第一个代码块工作的原因,但第二个代码块没有。
解决此问题的一种方法是创建一个包含数组的包装器对象,然后覆盖equals()
函数以实际比较数组中的元素。但是,由于您的数组只有两个索引,为什么不创建一个包含两个变量的类,然后重写equals函数?或者只使用PVector
实例。