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

Как преобразовать массив int [] в список?

Я ожидал, что этот код отобразит true:

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

Ответ 1

Arrays.asList(array) приведет к одиночному списку int[].

Он работает так, как вы ожидаете, если вы измените int[] на Integer[]. Не знаю, поможет ли вам это.

Ответ 2

Метод Arrays.asList(T ...) заключается в том, что при генерировании дженериков и преобразовании varargs фактически равен методу типа Arrays.ofList(Object[]) ( который является двоичным эквивалентом, версия JDK 1.4 того же метода).

Массив примитивов - это Object (см. также этот вопрос), но не Object[], поэтому компилятор считает, что вы используете версию varargs и генерирует массив Object вокруг вашего массива int. Вы можете проиллюстрировать, что происходит, добавив дополнительный шаг:

int[] array = {1, 2};
List<int[]> listOfArrays = Arrays.asList(array);
System.out.println(listOfArrays.contains(1));

Это компилируется и эквивалентен вашему коду. Он также явно возвращает false.

Компилятор переводит вызовы varargs в вызовы с одним массивом, поэтому вызов метода varargs, который ожидает, что параметры T ... с параметрами T t1, T t2, T t3 эквивалентен вызову его с помощью new T[]{t1, t2, t3}, но особый случай здесь заключается в том, что varargs с примитивами будет автобокс до того, как будет создан массив, если методу нужен массив объектов. Поэтому компилятор считает, что массив int передается как один объект и создает один массив элементов типа Object[], который он передает в asList().

Итак, вот приведенный выше код еще раз, как компилятор реализует его внутри:

int[] array = {1, 2};
// no generics because of type erasure
List listOfArrays = Arrays.asList(new Object[]{array});
System.out.println(listOfArrays.contains(1));

Вот несколько хороших и плохих способов вызвать Arrays.asList() со значениями int:

// These versions use autoboxing (which is potentially evil),
// but they are simple and readable

// ints are boxed to Integers, then wrapped in an Object[]
List<Integer> good1 = Arrays.asList(1,2,3);
// here we create an Integer[] array, and fill it with boxed ints
List<Integer> good2 = Arrays.asList(new Integer[]{1,2,3});

// These versions don't use autoboxing,
// but they are very verbose and not at all readable:

// this is awful, don't use Integer constructors
List<Integer> ugly1 = Arrays.asList(
    new Integer(1),new Integer(2),new Integer(3)
);
// this is slightly better (it uses the cached pool of Integers),
// but it still much too verbose
List<Integer> ugly2 = Arrays.asList(
    Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)
);

// And these versions produce compile errors:
// compile error, type is List<int[]>
List<Integer> bad1 = Arrays.asList(new int[]{1,2,3});
// compile error, type is List<Object>
List<Integer> bad2 = Arrays.asList(new Object[]{1,2,3});

Справка:


Но чтобы решить вашу проблему простым способом:

В Apache Commons/Lang есть некоторые библиотечные решения (см. ответ Божо) и в Google Guava:

Ответ 3

Arrays.asList(ArrayUtils.toObjectArray(array))

(ArrayUtilsнаходится из commons-lang)

Но если вы хотите просто позвонить contains, это не нужно. Просто используйте Arrays.binarySearch(..) (сначала отсортируйте массив)

Ответ 4

Это

System.out.println(Arrays.asList(array).contains(array));

возвращает true.

Ответ 5

Кажется, что ваше понимание Arrays.asList(T... a) неверно. Вы не были бы первым человеком, который бы предположил, как это работает.

Попробуйте с помощью

System.out.println(Arrays.asList(1, 2).contains(1));

Ответ 6

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

List<Integer> list = new ArrayList<Integer>(array.length);
for (int value : array) {
    list.add(value);
}

Ответ 7

Следующий код отображает true:

Integer[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));

(Ваша версия завершается с ошибкой, так как Int не является объектами, но Int [] является объектом. Поэтому вы будете называть asList (T... a) одним элементом, входящим в коллекцию, поскольку невозможно получить коллекцию а.)

Ответ 8

Когда вы вызываете

Arrays.asList(array)

в вашем массиве примитивов, вы получаете экземпляр List, содержащий один объект: массив значений int! Вы должны сначала преобразовать массив примитивов в массив объектов, как предлагает @Bozho в своем ответе.

Ответ 9

Если вы хотите только проверить, содержит ли массив определенный элемент, просто перебирайте массив и найдите элемент. Это займет o (n/2). Все другие решения менее эффективны. Любой метод, который копирует массив в список, должен выполнять итерацию по массиву, и поэтому для этой операции требуется только n атомных присвоений.

Ответ 10

Я не думаю, что есть метод вызова, который вы могли бы использовать. Попробуй так:

List<Integer> list = new ArrayList<Integer>();
  for (int index = 0; index < array.length; index++)
  {
    list.add(array[index]);
  }