在ArrayList中查找数组的索引

时间:2015-09-16 19:11:41

标签: java arrays list find indexof

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

4 个答案:

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