移动数组列表中的元素 java
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位
您的需求不是很清楚,但是要在数组列表中移动元素,例如使用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));
就代码行而言,最简单的方法是从列表中删除元素并将其重新插入到新位置:
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);
因为您基本上是将第 2 个元素移动到第 6 个位置等,您可以执行以下操作:
- 删除第二个元素,从而将剩余的元素向左移动 1
- 读取所需位置的元素
这可以在一行中完成:list.add( targetPos, list.remove( sourcePos ) )
。
当然,这仍然不如手动移动必须移动的部分那么有效,但您可能不想为此烦恼,除非您经常调用它或有大量列表。
而且,正如已经指出的那样,您必须确保 sourcePos < targetPos
。
你可以这样做(完全考虑你的要求):
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]+" ");
}
希望我的代码对您有所帮助。
如何在不丢失数据的情况下将一个元素移动到另一个元素的简单示例。
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]
从位置 0 移动到位置 1,条件为 fromPosition < toPosition
第 1 步:[A][A*][B][C][D]
将 [A]
移动到第二个位置(参数 toPosition)
第 2 步:[A*][B][C][D]
删除了旧的 [A]
位置(参数 fromPosition)
情况 2:将 [C]->[A]
从位置 2 移动到位置 0,条件为 fromPosition >= toPosition
第 1 步:[C*][A][B][C][D]
将 [C]
移动到第一个位置(参数 toPosition)- 我们向左移动,因此列表被拉伸(旧 [C] 位置增加 +1)
第 2 步:[C*][A][B][D]
删除了旧的 [C]
位置(参数 fromPosition)
我有以下数组列表:
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位
您的需求不是很清楚,但是要在数组列表中移动元素,例如使用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));
就代码行而言,最简单的方法是从列表中删除元素并将其重新插入到新位置:
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);
因为您基本上是将第 2 个元素移动到第 6 个位置等,您可以执行以下操作:
- 删除第二个元素,从而将剩余的元素向左移动 1
- 读取所需位置的元素
这可以在一行中完成:list.add( targetPos, list.remove( sourcePos ) )
。
当然,这仍然不如手动移动必须移动的部分那么有效,但您可能不想为此烦恼,除非您经常调用它或有大量列表。
而且,正如已经指出的那样,您必须确保 sourcePos < targetPos
。
你可以这样做(完全考虑你的要求):
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]+" ");
}
希望我的代码对您有所帮助。
如何在不丢失数据的情况下将一个元素移动到另一个元素的简单示例。
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]
从位置 0 移动到位置 1,条件为 fromPosition < toPosition
第 1 步:[A][A*][B][C][D]
将 [A]
移动到第二个位置(参数 toPosition)
第 2 步:[A*][B][C][D]
删除了旧的 [A]
位置(参数 fromPosition)
情况 2:将 [C]->[A]
从位置 2 移动到位置 0,条件为 fromPosition >= toPosition
第 1 步:[C*][A][B][C][D]
将 [C]
移动到第一个位置(参数 toPosition)- 我们向左移动,因此列表被拉伸(旧 [C] 位置增加 +1)
第 2 步:[C*][A][B][D]
删除了旧的 [C]
位置(参数 fromPosition)