Java Collections.rotate () с массивом не работает

У меня есть следующий код 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) не могут позволить себе потратить впустую так много процессорного времени и памяти, чтобы сделать преобразование.

8
задан Jonik 8 May 2010 в 18:10
поделиться

1 ответ

Это сложная проблема: да, 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 - Список Arrays.asList (T ... a) . Обратите внимание, что 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 элемента, как и ожидалось.

См. Также

21
ответ дан 5 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: