2011-02-08 95 views
50

所以我还是相当新的Java和我一直在ArrayList中的玩弄 - 我想要实现是这样做的方法:移动项目围绕一个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 

的部分我挣扎与“向上移动”部分。任何提示或代码示例如何实现这一点非常感谢。

回答

94

我碰到这个老问题在我寻找一个答案来了,我以为我会只是张贴万一有人我找到了解决办法通过其他在这里寻找同样的通行证。

为了交换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);

15

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

要删除 - ArrayList.remove和返回的对象赋值给一个变量
则所需的索引处添加这个对象返回 - ArrayList.add(int index, E element)

​​,E)

+2

这是实际工作来改变顺序的唯一解决方案ArrayList中的项目。谢谢! – mpemburn 2014-02-18 17:42:23

+1

的确非常优雅! – geekQ 2016-07-05 19:06:29

+0

删除它不移动,它正在改变两个对象的位置(交换),移动 - 它正在其他两个对象之间移动一个对象 – user25 2017-07-16 13:51:27

52

简单交换是好得多“在一个ArrayList移动​​的东西了”:

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

因为一个ArrayList使用一个数组,如果你从一个ArrayList中删除项目,它必须向上“移动”该项后的所有元素以填充阵列中的空隙。如果您插入一个项目,它必须移动该项目之后的所有元素以腾出空间插入它。如果阵列非常大,这些转换可能会非常昂贵。既然你知道你想要在列表中拥有相同数量的元素,那么做这样的交换可以让你“非常有效地”将元素“移动”到列表中的另一个位置。

正如克里斯圆盾和米哈尔Kreuzman指出,甚至有在Collections类一个方便的方法,以这三行代码减少至一个:

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

这很棒,collections.swap似乎是完美的。我注意到的一个小问题是,使用这个列表顶部的东西会导致越界异常 - 它仍然只是我想要的,但是有什么办法可以阻止它抛出越界异常吗? – user319940 2011-02-08 22:08:39

23

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

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