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를 창의적으로 사용하는 더 나은 솔루션이 있습니다.
여기에 인용문이 있지만 거기로 가서 전체 내용을 직접 읽어보십시오.
이 방법은 나머지 요소의 순서를 유지하면서 목록 내에서 하나 이상의 요소를 이동하기 위해 하위 목록에 유용하게 적용될 수 있습니다. 예를 들어, 다음 관용구는 인덱스 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
'IT TIP' 카테고리의 다른 글
| 투명한 배경으로 UITableViewCell을 만드는 방법 (0) | 2020.10.30 |
|---|---|
| 솔트 생성 및 오픈 소스 소프트웨어 (0) | 2020.10.30 |
| 라 라벨은 다 대다 관계 저장 / 업데이트 (0) | 2020.10.30 |
| 'git push heroku master'가 여전히 인증을 요청합니다. (0) | 2020.10.30 |
| JavaScript 객체 리터럴에서 변수 키를 사용하는 방법이 있습니까? (0) | 2020.10.30 |