[英]moving elements in arraylist java
我有以下数组列表:
arrList = {"A", "2b", "3c", "4x", "5y", "6k", "7", "8", "9", "10", "11", "13", "14", "15", "16", "17", "18", "19", "20"}
我想移动元素,所以它变成:
arrList = {"A", "3c", "4x", "5y", "6k", "2b", "7", "8", "9", "10", "11", "13", "14", "15", "16", "12", "17", "18", "19", "20"}
请注意:第 2 位中的项目已移至第 6 位。 第 12 位已移至第 16 位
谁能告诉我如何使用 for 循环实现这一目标? 或者,还有更好的方法?
如果我的列表是动态的并且不断增长,我希望继续使用相同的模式,以便项目在:
第 22 位将移至第 26 位
就代码行而言,最简单的方法是从列表中删除元素并将其重新插入到新位置:
list.add(toPos, list.remove(fromPos));
然而,这不一定是最有效的方法,因为它需要数组列表中的所有元素通过删除向下移动,并通过插入向上移动。
您可以通过显式原位移动所有元素来更有效地完成此操作:
Integer fromValue = list.get(fromPos);
int delta = fromPos < toPos ? 1 : -1;
for (int i = fromPos; i != toPos; i += delta) {
list.set(i, list.get(i + delta));
}
list.set(toPos, fromValue);
简单示例如何在不丢失数据的情况下将一个元素移动到另一个元素。
public void move(List myList, int fromPosition, int toPosition) {
if (fromPosition < toPosition) {
myList.add(toPosition, myList.get(fromPosition));
myList.remove(fromPosition);
} else {
myList.add(toPosition, myList.get(fromPosition));
myList.remove(fromPosition + 1);
}
}
对于: [A][B][C][D][E]
情况 1 :移动[A]->[B]
fromPosition 0, toPosition 1,条件 where fromPosition < toPosition
第 1 步: [A][A*][B][C][D]
将[A]
移动到第二个位置(参数 toPosition)
第 2 步: [A*][B][C][D]
删除旧的[A]
位置(参数 fromPosition)
情况 2 : 移动[C]->[A]
fromPosition 2, toPosition 0, 条件fromPosition >= toPosition
第 1 步: [C*][A][B][C][D]
将[C]
[C*][A][B][C][D]
移动到第一个位置(参数 toPosition) - 我们向左移动,所以列表被拉伸(旧的 [C] 位置增加了 +1 )
第 2 步: [C*][A][B][D]
删除旧的[C]
位置(参数 fromPosition)
由于您基本上是将第二个元素移动到第 6 个位置等,您可以执行以下操作:
这可以在一行中完成: list.add( targetPos, list.remove( sourcePos ) )
。
当然,这仍然不如仅移动必须手动移动的部分那样有效,但您可能不想为此烦恼,除非您真的经常调用它或有大量列表。
而且,正如已经指出的那样,您必须确保sourcePos < targetPos
。
您的需求不是很清楚,但要在数组列表中移动元素,请使用Collections.swap(arrayList,2,6);
例如
您可以使用subList
和addAll
方法。
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#subList-int-int- https://docs.oracle.com/javase/8/docs/api/ java/util/List.html#addAll-java.util.Collection-
例如
ArrayList myNewList = new ArrayList(); myNewList.addAll(sourceList.subList(2, 8)); myNewList.addAll(sourceList.subList(0, 1));
您可以这样做(完全考虑您的要求):
int shiftCount = 4;
if(arrList != null) {
for (int i = 1; i < arrList.size(); i +=10) {
if(arrList.size() < i+shiftCount+1) break;
String tmpObj = arrList.get(i);
arrList.remove(i);
arrList.add(i+shiftCount, tmpObj);
}
}
您的代码显示每个元素都应该向右移动 4 个块,我只是首先放置了最后 4 个元素,以便每个元素按照这里的要求移动 4 个位置是我的代码
String arrList[] = {"A", "2b", "3c", "4x", "5y", "6k", "7", "8", "9", "10", "11", "13", "14", "15", "16", "17", "18", "19", "20"};
String part1[] = new String[arrList.length-4];
System.arraycopy(arrList, 0, part1,0, arrList.length-4);
//System.out.println(arrList.length);
String part2[] = new String[4];
System.arraycopy(arrList, arrList.length-4, part2,0, 4);
System.out.println();
String[] result = Stream.concat(Arrays.stream(part2), Arrays.stream(part1))
.toArray(String[]::new);
System.out.println();
for(int hj =0 ;hj<result.length;hj++)
{
System.out.print(result[hj]+" ");
}
希望你发现我的代码有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.