使用Java的数组中元素的索引

时间:2015-07-31 00:24:41

标签: java arrays

Java中的以下代码返回-1。我认为应该返回3。

int[] array = {1,2,3,4,5,6}; 
System.out.println(Arrays.asList(array).indexOf(4));

你能帮我理解这个功能是如何运作的。

由于

8 个答案:

答案 0 :(得分:13)

在Java 5之前,Arrays.asList用于接受Object[]。当泛型和varargs被引入语言时,这被改为

public static <T> List<T> asList(T... arr)

在您的示例中,T不能是int,因为int是基本类型。不幸的是,签名与T相匹配,而不是int[],这是一种参考类型。结果是您最终得到一个包含数组的List,而不是List个整数。

在Java 4中,您的代码无法编译,因为int[]不是Object[]。不编译比产生奇怪的结果更可取,而在有效Java中,Josh Bloch说将asList改为varargs方法是错误的。

答案 1 :(得分:9)

Arrays.asList期待一个对象(或更多)。您的数组(array)是唯一的对象,因此调用该方法将创建一个只有一个对象的列表,这是您的数组。

在列表中调用indexOf将返回-1,因为您的列表包含数组对象而不是数组包含的数据列表,因此永远不会找到4

答案 2 :(得分:5)

int[] array = {1,2,3,4,5,6};
Arrays.stream(array).boxed().collect(Collectors.toList()).indexOf(4);

应该在保留原始int[]的同时做你想做的事。

您收到IntStream个邮件,将其装入Stream<Integer>,将其收集到List<Integer>,然后进行.indexOf()搜索。

答案 3 :(得分:4)

当您使用Arrays.asList()时,您已获得有关阵列发生的事情的答案。

需要考虑的其他事项:

  • 由于您的数组已排序,请考虑Arrays.binarySearch()
  • 如果您的数组未排序,则一个简单的自定义indexOf方法可以执行相同操作而不会浪费将int[]转换为List<Integer>
  • 的周期

示例:

public static void main(String[] args) throws Exception {
    int[] array = {1, 2, 3, 4, 5, 6};
    System.out.print("Binary Search: ");
    System.out.println(Arrays.binarySearch(array, 4));

    int[] array2 = {5, 8, 2, 5, 3, 4, 1};
    System.out.print("Manual Search: ");
    System.out.println(indexOf(array2, 4));
}

public static int indexOf(int[] array, int search) {
    for (int i = 0; i < array.length; i++) {
        if (array[i] == search) {
            return i;
        }
    }
    return -1;
}

结果:

Binary Search: 3
Manual Search: 5

答案 4 :(得分:3)

由于您使用的是基本类型的数组,因此无法使用。该数组的类型为int。如果你使用Integer类型,那将是有效的。 -1表示未找到指定元素的索引。

这是你想要做的:

Integer[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));

答案 5 :(得分:3)

你不能使用原始类型如int作为Java中泛型类的参数,因为int不是类,你应该使用Integer代替:

Integer[] array = {1,2,3,3,4,5}; 

List Arraylist=Arrays.asList(array);
System.out.println(Arraylist.indexOf(1));
System.out.println(Arraylist.indexOf(4));

输出:

0
4

请注意,Arraylist.indexOf(i)会返回列表中元素 i 首次出现的索引:

System.out.println(Arraylist.indexOf(3));

它将返回2,这是元素3的第一次出现,而不是3,因为列表中有2个元素为3。

答案 6 :(得分:2)

因为当您使用主数据类型数组执行此操作时,它将被视为List中的第一个元素。

int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array));

你会得到这个:

[[I@474e8d67]

答案 7 :(得分:2)

int[] array = {1,2,3,4,5,6};
  • 在java array中被视为Object
  • int[]特别是Object而非Object[]
  • 要致电Arrays.asList,您需要零个或多个Objects

以这种方式调用您的方法,

Arrays.asList((Object)(array));//Yes
Arrays.asList(1,2,3,4,5,6);//No

所以你将List<int[]>而不是List<Integer>

  

现在,您可能已经问过自己,Arrays.asList(1,2,3,4)   是不是为什么不是Arrays.asList(arrayInt)

Arrays.asList(1,2,3,4)中,所有值都自动装箱进入IntegerObject只有Integer[]所以在上述情况RDD[(Text, VectorWritable)] cad中特技。