在ArrayList中查找数组的索引

3

在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}));

你试图查找未添加到列表中的对象的索引。new Integer[] {1,1}创建一个新的整数对象数组,该数组并没有保存在你最初分配它的位置。它不是完全相同的,因此不在你的列表中。(这就像询问你的邻居约翰在哪里工作,但列表只包含来自邻近城市的约翰,他不在那个列表中)。 - GiantTree
在这里,你可以写下正确的代码。但是你可能想要通过书籍来提高Java的基础知识。关于这个(相等),可以在早期章节中找到相关内容。 - user2413972
4个回答

6

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

谢谢!那正是我需要的。 - user3803086

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)) 对于数组和一些类需要使用静态方法。


0

Java API 中指出,indexOf 方法“返回最低索引 i,使得 (o==null ? get(i)==null : o.equals( get(i))),如果没有这样的索引,则返回 -1”。对于数组而言,array1.equals(array2) 与 array1 == array2 相同,因此当这两个数组具有不同的引用时,你会得到 -1。


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的索引时,它将引用之前创建的同一整数数组对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接