Индекс элемента в массиве с использованием Java

17

Следующий код в Java возвращает -1. Я думал, что он должен вернуться 3.

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

Можете ли вы помочь мне понять, как работает эта функция.

Спасибо

    
задан Somdutta 31.07.2015 в 02:24
источник

8 ответов

13

Прежде чем Java 5, Arrays.asList используется для принятия Object[] . Когда generics и varargs были введены в язык, это было изменено на

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

В вашем примере T не может быть int , потому что int является примитивным типом. К сожалению, подпись совпадает с T , равной int[] , что является ссылочным типом. В результате вы получите List , содержащий массив, а не List целых чисел.

В Java 4 ваш код не был бы скомпилирован, потому что int[] не является Object[] . Не компиляция предпочтительнее производить странный результат, а в Effective Java Джош Блох говорит, что переоснащение asList для метода varargs было ошибкой.

    
ответ дан Paul Boddington 31.07.2015 в 02:43
источник
8

Arrays.asList ожидает объект (или больше). Ваш массив ( array ) является единственным объектом, поэтому вызов метода создаст список только одного объекта, который является вашим массивом.

Вызов indexOf в вашем списке вернет -1, потому что 4 никогда не будет найдено, так как ваш список содержит объект массива, а не список данных, которые содержит ваш массив.

    
ответ дан Jean-François Savard 31.07.2015 в 02:29
источник
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() .

    
ответ дан glglgl 31.07.2015 в 07:48
источник
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
    
ответ дан Shar1er80 31.07.2015 в 03:01
источник
3

Поскольку вы используете массив примитивного типа, это не сработает. Массив имеет тип int. Например, если вы используете Integer , то это будет работать. -1 означает, что индекс указанного элемента не найден.

Это то, что вы хотите сделать:

Integer[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
    
ответ дан Ralph 31.07.2015 в 02:30
источник
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 элемента из списка.

    
ответ дан Oghli 31.07.2015 в 05:12
источник
2

Потому что, когда вы делаете это с помощью массива первичных данных, он будет рассматриваться как первый элемент в списке.

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

Вы получите следующее:

[[I@474e8d67]
    
ответ дан Sean 31.07.2015 в 02:53
источник
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) все значения autoboxed в Integer , который является исключительно Object , поэтому в приведенном выше случае Integer[] cad делает трюк.

    
ответ дан coder-croc 31.07.2015 в 03:25
источник