Widestrip
@Widestrip
кодер-самоучка

Java как сделать циклический сдвиг LinkedList?

Требуется сформировать HashMap либо SortedMap из циклически сдвигаемого для каждого ключа списка.

Собственно список:
LinkedList<Character> line = new LinkedList<>(Arrays.asList(' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
            'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E',
            'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            '!', ',', '.', ':', ';', '-'));


ХэшКарта:
Map<Character, LinkedList<Character>> square = new TreeMap<>();


Функция, заполняющая карту:
private void buildSquare() {
        int i = 0;
        LinkedList<Character> tmp = new LinkedList<>(line);
        for(Character elem: line) {
            Collections.rotate(tmp, 1);
            square.put(elem, tmp);
            i += 1;
        }
    }


Собственно требуется, чтобы карта для каждого ключа содержала сдвинутый на 1 элемент влево список.
Однако на выходе получается полное отсутствие сдвигания.
Уже второй день не могу разобраться.
  • Вопрос задан
  • 416 просмотров
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
Тут у вас две ошибки:
1. Collections.rotate(tmp, 1); // тут, видимо, должна быть i, вместо единички. Так у вас i инкрементируется, но нигде не используется.
2. LinkedList tmp = new LinkedList<>(line); // Вы правильно догадались сделать копию исходного листа, но вам нужно его создавать каждый раз внутри цикла. В вашей реализации в все Value результируещей Map всегда попадает один и тот же объект (потому что ссылка одна и та же), он итерируется, и, в итоге, проходит полный круг.
3*. Я не уверен, но, кажется, нужно сдвигать в другую сторону.

Итого, метод получится такой:
private static void buildSquare() {
        int i = 0;
        for(Character elem: line) {
            LinkedList<Character> tmp = new LinkedList<>(line);
            Collections.rotate(tmp, i++); // i инкрементируется сразу в месте использования. (Попробуйте i--, так, кажется, будет правильнее)
            square.put(elem, tmp);
        }
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽