У меня есть следующий код Java:
import java.util.Arrays;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
int[] test = {1,2,3,4,5};
Collections.rotate(Arrays.asList(test), -1);
for(int i = 0; i < test.length; i++) { System.out.println(test[i]); }
}
}
Я хочу, чтобы массив был повернут, но вывод, который я получаю,
1
2
3
4
5
Почему это?
И есть ли альтернативное решение?
Править:
Таким образом, это работает:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
int[] test = {1,2,3,4,5};
List<Integer> testList = new ArrayList<Integer>();
for(int i = 0; i < test.length; i++) { testList.add(test[i]); }
Collections.rotate(testList, -1);
for(int i = 0; i < test.length; i++) { System.out.println(testList.get(i)); }
}
}
Но Arrays.asList, как предполагается, возвращает список, который при записи в копирует изменения в массиве. Там какой-либо путь состоит в том, чтобы зафиксировать это, вручную не делая преобразования из массива для списка?
Я (думают, что I) не могут позволить себе потратить впустую так много процессорного времени и памяти, чтобы сделать преобразование.
Это сложная проблема: да, asList
поддерживает список
, который возвращается с массивом, и изменяет to the Список
будет «сквозной записью» в массив. Однако из-за того, как varargs of T ...
взаимодействует с массивом примитивного типа в этом случае, вы фактически создаете список с 1 элементом!
int[] test = {1,2,3,4,5};
System.out.println(Arrays.asList(test).size());
// prints "1"
Давайте попробуем что-нибудь другое:
int[] test = {1,2,3,4,5};
List<Integer> list = Arrays.asList(test);
// "Type mismatch: cannot convert from List<int[]> to List<Integer>"
Как видите, varargs с int []
работает не так, как вы планировали, и компилятор выдает ошибку. Arrays.asList
фактически возвращает 1-элементный List
вместо 5-элементного List
.
Использование Integer []
вместо int []
работает должным образом:
Integer[] test = {1,2,3,4,5};
Collections.rotate(Arrays.asList(test), -1);
System.out.println(Arrays.toString(test));
// prints "[2, 3, 4, 5, 1]"
Полная подпись asList
-
. Обратите внимание, что T
не может быть int
в этом случае по той же причине, по которой у вас не может быть List
в Java: ] T
должен быть ссылочным типом.
Рассмотрим следующий фрагмент:
System.out.println(Arrays.asList(1,2,3));
// prints "[1, 2, 3]"
Здесь происходит то, что каждый int
упаковывается в Integer
, а механизм varargs «работает» и asList
] создает список из 3 элементов.Теперь рассмотрим вместо этого следующую форму:
System.out.println(Arrays.asList(new int[] { 1,2,3 }));
// prints "[[I@xxxxxx]"
Теперь аргумент asList
- это int []
. T
не может быть int
, поэтому механизм T ...
varargs «не работает», а asList
получает только один элемент, и это int []
, а не сами значения int
.
Теперь рассмотрим эту форму:
System.out.println(Arrays.asList(new Integer[] { 1,2,3 }));
// prints "[1, 2, 3]"
Теперь, поскольку Integer []
является T ...
, asList
получает 3 элемента, как и ожидалось.
int []
не блокируется автоматически в Integer []