Java:在数组中移动项目

时间:2011-04-04 08:01:26

标签: java arrays

我希望在数组中移动一些东西。

我希望能够将给定阵列中的最后一项移动到某个位置,同时将当前位置中的那些移动到右侧。我希望它从第一个点移动到第二个点等,而不替换当前存在的项目。

离)

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

6 个答案:

答案 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]+" ");
}