我希望在数组中移动一些东西。
我希望能够将给定阵列中的最后一项移动到某个位置,同时将当前位置中的那些移动到右侧。我希望它从第一个点移动到第二个点等,而不替换当前存在的项目。
离)
a,b,c,d,e
说我想转移到“3” - 然后它会变成
a,b,c,e,d
我目前有以下内容:
public static void moveLastup(String[] stuff, int position)
{
String y = stuff[stuff.length-1];
for (int x = stuff.length-1; x > position; x--)
list[x] = list[x-1];
stuff[position] = y;
}
编辑:抱歉,我认为我不够清楚。我希望能够做到的是这种方法,我应该可以将最后一块移动到任何地方。
for (int pos = 0; pos < stuff.length; pos++)
{
moveLastup(list,pos);
showList(list);
}
现在,当我执行此操作时,它只需要for循环中下一个列表中的最后一项 前)
e,a,b,c,d
e,d,a,b,c
e,d,c,b,a
我希望它显示
e,a,b,c,d
a,e,b,c,d
a,b,e,c,d
答案 0 :(得分:3)
这是一个更有效,更简洁的解决方案,依赖于本机实现的System.arraycopy
:
public static void moveLastup(String[] arr, int pos) {
String last = arr[arr.length-1];
// Copy sub-array starting at pos to pos+1
System.arraycopy(arr, pos, arr, pos + 1, arr.length - pos - 1);
arr[pos] = last;
}
还有一些测试代码:
public static void main(String[] args) {
String[] test = { "one", "two", "three", "four", "five" };
// Move "five" to index 2
moveLastup(test, 2);
// [one, two, five, three, four]
System.out.println(Arrays.toString(test));
}
关于您的编辑:您正在使用并修改原始数组。如果您想在每个moveLastup
中“重新开始”,则需要处理副本。此代码段打印出您想要的内容:
String[] list = { "a", "b", "c", "d", "e" };
for (int pos = 0; pos < list.length; pos++) {
String[] tmpCopy = list.clone();
moveLastup(tmpCopy, pos);
showList(tmpCopy);
}
<强>输出:强>
[
的e
强>, a, b, c, d]
[a,
的e
强>, b, c, d]
[a, b,
的e
强>, c, d]
[a, b, c,
的e
强>, d]
[a, b, c, d,
的e
强>]
答案 1 :(得分:2)
我知道问题是关于阵列 - 不想开始讨论性能&#34;对比&#34;问题和&#34;为什么我使用纯数组&#34; - 但对于那些使用列表的人,我认为这可能很有用。
java.util.Collections.rotate 方法。是的,这个名字很奇怪,通过查看javadoc的一部分:
请注意,此方法可以有效地应用于子列表 移动列表中的一个或多个元素,同时保留 其余元素的顺序。例如,以下成语 将索引j处的元素向前移动到位置 k(必须大于或等于j):
Collections.rotate(list.subList(j, k+1), -1);为了使这个具体化,假设列表包含 [a,b,c,d,e]。在索引1处移动元素 (b)转发两个职位,执行以下调用:
Collections.rotate(l.subList(1, 4), -1);结果列表是[a,c,d,b,e]。
要向前移动多个元素,请增加绝对值 的旋转距离。要向后移动元素,请使用正数 转移距离。
public void moveElement(List list, int a, int b) {
// forward or backward
int direction = a > b ? 1 : -1;
// always from minor to major to subList
int minor = a < b ? a : b;
int major = b > a ? b : a;
Collections.rotate(list.subList(minor, major + 1), direction);
}
答案 2 :(得分:1)
首先,在您的代码中执行
for (int x = stuff.length-1; x > pos; x--)
其中pos甚至没有定义,我建议将其改为位置。 第二,将“列表”改为“东西”。
修改后的工作代码:
public static void moveLastup(String[] stuff, int position)
{
String y = stuff[stuff.length-1];
for (int x = stuff.length-1; x > position; x--)
stuff[x] = stuff[x-1];
stuff[position] = y;
}
答案 3 :(得分:1)
您没有使用List<String>
代替String[]
的任何特殊原因?它将使这些类型的操作更容易。使用ArrayList<String>
,您只需要:
list.add(3, list.remove(list.size() - 1));
如果使用LinkedList<String>
:
list.add(3, list.removeLast());
这是一个基于你的更完整的例子:
LinkedList<String> list = new LinkedList<String>();
list.addAll(Arrays.asList("a", "b", "c", "d", "e"));
list.add(3, list.removeLast());
System.out.println(list); // prints "[a, b, c, e, d]"
答案 4 :(得分:0)
另一种基于System.arraycopy
的简短快速解决方案:
System.arraycopy(array, insert, array, insert+1, array.length-insert-1);
数组内容从索引“insert”“向右推”。
以下是一些演示代码:
int[] array = {1,2,3,4,5};
int insert = 2;
int last = array[array.length-1];
System.arraycopy(array, insert, array, insert+1, array.length-insert-1);
array[insert] = last;
for (int value:array) System.out.println(value);
答案 5 :(得分:0)
char arr1[]=new arr1[5]; // arr1 contains a,b,c,d,e in order
char arr2[]=new arr2[5];
for(int i=0;i<arr1.length;i++) { // copy contents to arr2
arr2[i]=arr1[i];
}
for(int i=0,j=4;i<arr1.length;i++) {
arr2[i]=arr1[4];
arr2[i+1]=arr1[4];
arr2[i+2]=arr1[i+1];
arr2[i+3]=arr1[i+2];
arr2[i+4]=arr1[i+3];
}
for(int i=0;arr2.length;i++) { // Final result
System.out.println(arr[i]+" ");
}