IT TIP

ArrayList에서 항목 이동

itqueen 2020. 10. 30. 21:18
반응형

ArrayList에서 항목 이동


나는 ArrayLists를 가지고 놀았다 . 내가 달성하려는 것은 다음과 같은 작업을 수행하는 방법입니다.

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

제가 고민하고있는 부분은 "위로 이동"부분입니다. 이것이 어떻게 달성 될 수 있는지에 대한 팁이나 코드 샘플은 대단히 감사합니다.


나는 대답을 찾기 위해이 오래된 질문을 보았고 다른 누군가가 여기에서 같은 것을 찾는 경우 내가 찾은 해결책을 게시 할 것이라고 생각했습니다.

두 요소를 교체하는 경우 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);


ArrayList에서 "무언가 위로 이동"하는 데는 간단한 스왑이 훨씬 좋습니다.

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

ArrayList는 배열을 사용하기 때문에 ArrayList에서 항목을 제거하면 해당 항목 뒤의 모든 요소를 ​​위로 "이동"하여 배열의 간격을 채워야합니다. 항목을 삽입하면 해당 항목 이후의 모든 요소를 ​​이동하여 삽입 할 공간을 만들어야합니다. 어레이가 매우 큰 경우 이러한 변화는 매우 비쌀 수 있습니다. 목록에서 동일한 수의 요소로 끝나기를 원한다는 것을 알고 있으므로 이와 같은 교체를 수행하면 요소를 목록의 다른 위치로 매우 효율적으로 "이동"할 수 있습니다.

Chris Buckler와 Michal Kreuzman이 지적했듯이 Collections 클래스에는이 세 줄의 코드를 하나로 줄이는 편리한 메서드도 있습니다.

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

이 간단한 코드를 시도해 볼 수 있습니다. 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);

위로 이동하려면 제거하고 추가하십시오.

제거하려면 -ArrayList.remove 및 반환 된 개체를 변수에 할당 한
다음이 개체를 필요한 인덱스에 다시 추가합니다.ArrayList.add(int index, E element)

http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html#add(int , E)


Mikkel이 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);
    }
}

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);

재귀를 적용하여 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);
                }
            }
    }

서로에 대해 움직이는 요소는 내 프로젝트에서 많이 필요했습니다. 그래서 목록의 요소를 다른 요소와 관련된 위치로 이동하는 작은 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;
        }
    }

참고URL : https://stackoverflow.com/questions/4938626/moving-items-around-in-an-arraylist

반응형