Следующий код в Java возвращает -1. Я думал, что он должен вернуться 3.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Можете ли вы помочь мне понять, как работает эта функция.
Спасибо
Следующий код в Java возвращает -1. Я думал, что он должен вернуться 3.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Можете ли вы помочь мне понять, как работает эта функция.
Спасибо
Перед 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 было ошибкой.
Arrays.asList
ожидать объект (или больше). Ваш массив (array
) является единственным объектом, поэтому вызов метода создаст список только одного объекта, который является вашим массивом.
Вызов indexOf
в вашем списке будет возвращать -1, потому что 4
никогда не будет найден, так как ваш список содержит объект массива, а не список данных, содержащихся в вашем массиве.
int[] array = {1,2,3,4,5,6};
Arrays.stream(array).boxed().collect(Collectors.toList()).indexOf(4);
должен делать то, что вам нужно, сохраняя исходный int[]
.
Вы получите IntStream
, вставьте его в Stream<Integer>
, соберите его до List<Integer>
и затем выполните поиск .indexOf()
.
У вас есть ответы на вопрос о том, что происходит с вашим массивом, когда вы используете Arrays.asList()
.
Другие вещи, которые следует учитывать:
Arrays.binarySearch()
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
Поскольку вы используете массив примитивного типа, это не сработает. Массив имеет тип int. Например, если вы используете тип Integer
, это сработает.
-1 означает, что индекс указанного элемента не найден.
Это то, что вы хотите сделать:
Integer[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Вы не можете использовать примитивные типы, такие как 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 элемента из списка.
Потому что, когда вы делаете это с помощью массива первичных данных, он будет рассматриваться как первый элемент в списке.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array));
Вы получите следующее:
[[[email protected]]
int[] array = {1,2,3,4,5,6};
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 делает трюк.