Подтвердить что ты не робот

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

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

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

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

Спасибо

4b9b3361

Ответ 1

Перед 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 было ошибкой.

Ответ 2

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

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

Ответ 3

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

должен делать то, что вам нужно, сохраняя исходный int[].

Вы получите IntStream, вставьте его в Stream<Integer>, соберите его до List<Integer> и затем выполните поиск .indexOf().

Ответ 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

Ответ 5

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

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

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

Ответ 6

Вы не можете использовать примитивные типы, такие как 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 элемента из списка.

Ответ 7

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

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

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

[[[email protected]]

Ответ 8

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) все значения автобоксируются в Integer, который является только Object, поэтому в приведенном выше случае Integer[] cad делает трюк.