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

Перемещение элементов в ArrayList

Я играл с ArrayList s. То, что я пытаюсь достичь, - это метод сделать что-то вроде этого:

Item 1
Item 2
Item 3
Item 4

Я пытаюсь перемещать элементы вверх по списку, если только он не находится сверху, и в этом случае он останется прежним. Например, если элемент 3 был перемещен, список будет выглядеть так:

Item 1
Item 3
Item 2
Item 4

Из моего небольшого понимания на данный момент я бы хотел что-то вроде:

IF arrayname index is not equal to 0
THEN move up
ELSE do nothing

Часть, с которой я борюсь, это часть "двигаться вверх". Любые советы или примеры кода того, как этого можно достичь, очень ценятся.

4b9b3361

Ответ 1

Я столкнулся с этим старым вопросом в поисках ответа, и я подумал, что просто отправлю решение, которое я нашел, если кто-то еще пройдёт сюда, ища то же самое.

Для замены 2 элементов Collections.swap в порядке. Но если мы хотим переместить больше элементов, есть лучшее решение, которое предполагает творческое использование Collections.sublist и Collections.rotate, о котором я не думал, пока не увидел, что он описан здесь:

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#rotate%28java.util.List,%20int%29

Вот цитата, но идите туда и прочитайте все для себя:

Обратите внимание, что этот метод может быть полезен для подписок для перемещения одного или более элементов в списке, сохраняя при этом порядок остальные элементы. Например, следующая идиома перемещает элемент при переходе индекса j в положение k (которое должно быть больше или равно к j):

Collections.rotate(list.subList(j, k+1), -1);

Ответ 2

Простой своп намного лучше для "перемещения чего-то" в ArrayList:

if(i > 0) {
    Item toMove = arrayList.get(i);
    arrayList.set(i, arrayList.get(i-1));
    arrayList.set(i-1, toMove);
}

Поскольку ArrayList использует массив, если вы удаляете элемент из ArrayList, он должен "сдвигать" все элементы после этого элемента вверх, чтобы заполнить пробел в массиве. Если вы вставляете элемент, он должен переместить все элементы после этого элемента, чтобы освободить место для его вставки. Эти сдвиги могут стать очень дорогими, если ваш массив очень большой. Так как вы знаете, что хотите получить одинаковое количество элементов в списке, то подобная свопа позволяет очень эффективно "перемещать" элемент в другое место в списке.

Как подчеркивает Крис Баклер и Михал Крейцман, в классе Collections есть даже удобный метод, который сводит эти три строки кода к одному:

Collections.swap(arrayList, i, i-1);

Ответ 3

вы можете попробовать этот простой код, Collections.swap(list, i, j) - это то, что вы ищете.

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");

    String toMoveUp = "3";
    while (list.indexOf(toMoveUp) != 0) {
        int i = list.indexOf(toMoveUp);
        Collections.swap(list, i, i - 1);
    }

    System.out.println(list);

Ответ 5

Как Миккель опубликовал до Collections.rotate простой способ. Я использую этот метод для перемещения элементов вверх и вниз в списке.

public static <T> void moveItem(int sourceIndex, int targetIndex, List<T> list) {
    if (sourceIndex <= targetIndex) {
        Collections.rotate(list.subList(sourceIndex, targetIndex + 1), -1);
    } else {
        Collections.rotate(list.subList(targetIndex, sourceIndex + 1), 1);
    }
}

Ответ 6

В Move элемент в списке просто добавьте:

// move item to index 0
Object object = ObjectList.get(index);
ObjectList.remove(index);
ObjectList.add(0,object);

В Swap два элемента в списке просто добавляют:

// swap item 10 with 20
Collections.swap(ObjectList,10,20);

Ответ 7

Применение рекурсии для изменения порядка элементов в arraylist

public class ArrayListUtils {
            public static <T> void reArrange(List<T> list,int from, int to){
                if(from != to){
                     if(from > to)
                        reArrange(list,from -1, to);
                      else
                        reArrange(list,from +1, to);

                     Collections.swap(list, from, to);
                }
            }
    }

Ответ 8

Перемещение элемента по отношению друг к другу - это то, что мне нужно было много в моем проекте. Поэтому я написал небольшой класс util, который перемещает элемент в списке в позицию относительно другого элемента. Не стесняйтесь использовать (и улучшать;))

import java.util.List;

public class ListMoveUtil
{
    enum Position
    {
        BEFORE, AFTER
    };

    /**
     * Moves element `elementToMove` to be just before or just after `targetElement`.
     *
     * @param list
     * @param elementToMove
     * @param targetElement
     * @param pos
     */
    public static <T> void moveElementTo( List<T> list, T elementToMove, T targetElement, Position pos )
    {
        if ( elementToMove.equals( targetElement ) )
        {
            return;
        }
        int srcIndex = list.indexOf( elementToMove );
        int targetIndex = list.indexOf( targetElement );
        if ( srcIndex < 0 )
        {
            throw new IllegalArgumentException( "Element: " + elementToMove + " not in the list!" );
        }
        if ( targetIndex < 0 )
        {
            throw new IllegalArgumentException( "Element: " + targetElement + " not in the list!" );
        }
        list.remove( elementToMove );

        // if the element to move is after the targetelement in the list, just remove it
        // else the element to move is before the targetelement. When we removed it, the targetindex should be decreased by one
        if ( srcIndex < targetIndex )
        {
            targetIndex -= 1;
        }
        switch ( pos )
        {
            case AFTER:
                list.add( targetIndex + 1, elementToMove );
                break;
            case BEFORE:
                list.add( targetIndex, elementToMove );
                break;
        }
    }