所以我还是刚接触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
我正在努力的部分是“向上移动”部分。任何有关如何实现这一目标的提示或代码示例都非常感谢。
答案 0 :(得分:113)
我在寻找答案时遇到了这个老问题,我想我会发布我找到的解决方案,以防其他人经过这里寻找同样的问题。
对于交换2个元素,Collections.swap很好。但是如果我们想要移动更多元素,那么有一个更好的解决方案,包括创建性地使用Collections.sublist和Collections.rotate,直到我在这里看到它之前我才想到它:
这是一个引用,但去那里也为自己阅读整个事情:
请注意,此方法可以有效地应用于子列表以移动一个 列表中的更多元素,同时保留列表的顺序 剩下的元素。例如,以下习语移动元素 在索引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)就是你要找的。 p>
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