是否可以在ArrayList中找到数组的索引?
方法indexOf
似乎不起作用。例如,对于大小为2的给定数组列表,此代码打印“-1”
List<Integer[]> nodes = new ArrayList<Integer[]>();
nodes.add(new Integer[] {1,1});
System.out.println(nodes.indexOf(new Integer[] {1, 1}));
答案 0 :(得分:6)
原始Java数组的equals()
实现执行引用相等性检查。意思是,如果引用指向数组的相同实例,它们只被视为相等。
您可以编写自己的索引搜索方法,使用Arrays.equals()
静态方法,如下所示:
List<Integer[]> nodes = new ArrayList<Integer[]>();
nodes.add(new Integer[] {1,1});
Integer[] lookingFor = new Integer[] {1,1};
int index = -1;
for (int i = 0; i < nodes.size(); i++) {
Integer[] array = nodes.get(i);
if (Arrays.equals(lookingFor, array)) {
index = i;
break;
}
}
System.out.println(index); // 0
答案 1 :(得分:2)
在这种情况下,您需要了解Java通过引用而不是值进行比较。以下代码显示正确的解决方案:
List<Integer[]> nodes = new ArrayList<>();
Integer[] a = new Integer[] {1,1};
nodes.add(a);
System.out.println(nodes.indexOf(a)); //0
System.out.println(a == a); //true
System.out.println(a == new Integer[] {1,1}); //false
System.out.println(Arrays.equals(a, new Integer[]{1, 1})); //true
用于比较的普通对象是使用方法equals()。 (等等a.equals(b))对于数组和某些类需要静态方法。
答案 2 :(得分:0)
indexOf方法“返回最低索引i,使得(o == null?get(i)== null:o.equals(get(i))),如果没有这样的索引,则返回-1”,如在Java API中声明。对于数组,array1.equals(array2)与array1 == array2相同,因此你得到-1,因为这两个数组有不同的引用。
答案 3 :(得分:0)
不,你不能那样做。 new Integer[]{1, 1}
是一个整数对象,您的代码会创建以分隔相同的对象。
要做你想做的事,
// You need to save a reference of your array in a variable
Integer[] arr = new Integer[]{1, 1};
// Add it to your list
nodes.add(arr);
// Finally retrieve the index
System.out.println(nodes.indexOf(arr));
当您打印出变量arr
的索引时,它将引用之前创建的相同整数数组对象。