Как вы перемещаете группу объектов в другое место внутри ArrayList с помощью Java? - PullRequest
2 голосов
/ 30 января 2012

Допустим, у меня есть ArrayList со значениями {1, 4, 6, 54, 9, 34, 21, 53}.

Мне нужно переместить значения 1, 4 и 6 в индекс после 34. Мне также нужно переместить значения 21 и 53 перед 54. Поэтому мой ArrayList должен выглядеть следующим образом: {21, 53, 54, 9 , 34, 1, 4, 6};

Я пытался использовать:

Collections.rotate (arr.subList (0, 2), -3); Collections.rotate (arr.subList (6, 7), 2);

Однако все, что это делает, это вращает индексы внутри подсписков.

Есть идеи, как заставить это работать?

Ответы [ 2 ]

4 голосов
/ 30 января 2012

замечаю, что

Collections.rotate(arr.subList(0, 6), -3);

перемещает 1, 4 и 6 к индексу после 34, по желанию. Я подозреваю, что этот прием был бы в целом применим в зависимости от того, находится ли целевой индекс до или после перемещения подсписка.

<T> void moveTo(List<T> list, int fromIndex, int toIndex, int destIndex) {
  if (fromIndex == destIndex) return;
  if (fromIndex < destIndex && destIndex < toIndex) 
    throw new IllegalArgumentException();
    // I don't even know what that would do!
  if (fromIndex < destIndex) {
     Collections.rotate(list.subList(fromIndex, destIndex + 1),
       fromIndex - toIndex);
  } else {
     Collections.rotate(list.subList(destIndex, toIndex + 1),
       toIndex - fromIndex);
  }
}

, кажется, работает в общем случае.

1 голос
/ 30 января 2012

Для этого конкретного случая,

Collections.rotate(arr.subList(0, 6), 3 );
Collections.rotate(arr, 2 );

работает. Но я не знаю, какой общий случай вы ищете.

...