Использование java 'indexOf' для 'float []' [дубликат]
На этот вопрос уже есть ответ здесь:
- Массивы Java.asList на примитивном типе массива создает неожиданный тип списка [duplicate] 2 ответа
- массивы.asList () работает не так, как надо? 9 ответов
В Java, используя java.util.Arrays
, следующие коды:
float[] arr = {(float)0.2, (float)4.5};
Float[] brr = {new Float(0.2), new Float(4.5)};
Float x = new Float(4.5);
float y = (float)4.5;
System.out.println(Arrays.asList(arr).indexOf(x));
System.out.println(Arrays.asList(arr).indexOf(y));
System.out.println(Arrays.asList(brr).indexOf(x));
System.out.println(Arrays.asList(brr).indexOf(y));
Дает
-1
-1
1
1
Мой вопрос: Как я могу искать индекс 4.5 в массиве arr
?
Я думал, что Arrays.asList(arr)
составляет список объектов из arr
, но он не ведет себя так, как другой массив, brr
.
3 ответа:
Arrays.asList
принимаетT...
в качестве аргумента. Когда параметр представляет собой массив объектов, он передается так, как если бы вы написалиArrays.asList(new Float(0.2), new Float(4.5))
.Во втором случае параметр представляет собой массив примитивов. Здесь компилятор Java решает рассматривать весь массив как один объект. Следовательно, вы будете передавать массив, содержащий один элемент, массив поплавков.
Чтобы подтвердить это, попробуйте следующее:
Arrays.asList(arr).indexOf(arr) // returns 0
Так как метод типизируется как
<T> List<T> asList(T...ts)
только второй из этого допускаются утверждения:System.out.println(Arrays.<Float>asList(arr).indexOf(x)); //Error System.out.println(Arrays.<Float>asList(brr).indexOf(x)); //List<Float>
Первый из примитивных типов не может быть типизирован как Float в аргументе.
Оператор для преобразования его в список выглядит следующим образом:
List<float[]> l = Arrays.<float[]>asList(arr); //The array is the only index in the List
Да, он ведет себя так. Проблема в том, что вы не создаете arr как Float object array. Вместо этого вы делаете массив примитивным.
Попробуйте этот код
Float[] arr = {(float)0.2, (float)4.5}; Float[] brr = {new Float(0.2), new Float(4.5)}; float x = 0.2f; float y = (float)4.5; System.out.println(Arrays.asList(arr).indexOf(x)); System.out.println(Arrays.asList(arr).indexOf(y)); System.out.println(Arrays.asList(brr).indexOf(x)); System.out.println(Arrays.asList(brr).indexOf(y));
Этот код предоставит вам желаемый результат
Arrays.asList(arr)
, еслиarr
является массивом примитивов, то создается список одного элемента, который является самим массивом.То есть:
float[] arr = {(float)0.2, (float)4.5}; System.out.println(Arrays.asList(arr).get(0).getClass().getSimpleName()); // Prints "float[]" System.out.println(Arrays.asList(arr).size()); // Prints "1"