在ArrayList中移动项目

时间:2011-02-08 21:23:24

标签: java arraylist

所以我还是刚接触Java并且我一直在使用ArrayList - 我想要实现的是一种方法来做这样的事情:

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

我正在努力的部分是“向上移动”部分。任何有关如何实现这一目标的提示或代码示例都非常感谢。

8 个答案:

答案 0 :(得分:113)

我在寻找答案时遇到了这个老问题,我想我会发布我找到的解决方案,以防其他人经过这里寻找同样的问题。

对于交换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);

答案 1 :(得分:60)

简单的交换对于在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);

答案 2 :(得分:28)

你可以尝试这个简单的代码,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);

答案 3 :(得分:20)

向上移动,删除然后添加。

删除 - ArrayList.remove并将返回的对象分配给变量
然后将此对象添加回所需的索引 - ArrayList.add(int index, E element)

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

答案 4 :(得分:4)

列表中的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);

答案 5 :(得分:3)

应用递归来重新排列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);
                }
            }
    }

答案 6 :(得分:0)

相对于彼此移动元素是我在我的项目中需要很多的东西。所以我写了一个小的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;
        }
    }

答案 7 :(得分:0)

Kotlin解决方案,可将元素从“ fromPos”移动到“ toPos”,并相应地移动所有其他项(对于在Android应用程序中以交错布局recyclerView移动项很有用)

mysqldump -u root database table