在 ArrayList 中查找数组的索引

Find index of array in ArrayList

是否可以在 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}));

您需要了解 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))对于数组和一些 class 需要静态方法。

原始 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

indexOf 方法 "returns the lowest index i such that (o==null ? get(i)==null : o.equals( get(i))), or -1 if there is no such index",如 Java API 中所述。对于数组,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的索引时,它会引用之前创建的同一个整数数组对象。