在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}));
equals()
方法实现了原始 Java 数组的引用相等性检查。这意味着,只有当引用指向数组的相同实例时,它们才被认为是相等的。
你可以编写自己的索引查找方法,使用 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
您需要理解在这种情况下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)) 对于数组和一些类需要使用静态方法。
Java API 中指出,indexOf 方法“返回最低索引 i,使得 (o==null ? get(i)==null : o.equals( get(i))),如果没有这样的索引,则返回 -1”。对于数组而言,array1.equals(array2) 与 array1 == array2 相同,因此当这两个数组具有不同的引用时,你会得到 -1。
不,你不能这样做。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
的索引时,它将引用之前创建的同一整数数组对象。
new Integer[] {1,1}
创建一个新的整数对象数组,该数组并没有保存在你最初分配它的位置。它不是完全相同的,因此不在你的列表中。(这就像询问你的邻居约翰在哪里工作,但列表只包含来自邻近城市的约翰,他不在那个列表中)。 - GiantTree