Java,数组中的移位元素

dar*_*sky 44 java arrays algorithm shift

我有一个Java对象数组,我试图将一个元素拉到顶部,然后将其余元素向下移动一个.

假设我有一个大小为10的数组,我试图拉第五个元素.第五个元素进入位置0,从0到5的所有元素将向下移动一个.

此算法未正确移动元素:

Object temp = pool[position];

for (int i = 0; i < position; i++) {                
    array[i+1] = array[i];
}
array[0] = temp;
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

How*_*ard 87

逻辑上它不起作用你应该扭转你的循环:

for (int i = position-1; i >= 0; i--) {                
    array[i+1] = array[i];
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用

System.arraycopy(array, 0, array, 1, position);
Run Code Online (Sandbox Code Playgroud)

  • @Tullochgorum System.arraycopy可以移动元素,因此您不应创建该数组的新副本。手册说:“如果src和dest参数引用相同的数组对象,则将执行复制,就好像在srcPos到srcPos + length-1位置的组件首先被复制到一个临时数组中一样。”该句子中的关键词是“好像”。 (2认同)

Kom*_*dia 25

假设你的阵列是{10,20,30,40,50,60,70,80,90,100}

你的循环做的是:

迭代1: array [1] = array [0]; {} 10,10,30,40,50,60,70,80,90,100

迭代2: array [2] = array [1]; {} 10,10,10,40,50,60,70,80,90,100

你应该做的是

Object temp = pool[position];

for (int i = (position - 1); i >= 0; i--) {                
    array[i+1] = array[i];
}

array[0] = temp;
Run Code Online (Sandbox Code Playgroud)

  • 生成代码的差异是微不足道的(`(position - 1)`的额外减法)但是`position`和`>`的清晰度和清晰度代替`(position-1)`和`= =`很重要. (19认同)
  • 显然最好写`for(int i = position; i> 0; i--){array [i] = array [i-1]; }` (14认同)
  • 有关系吗? (3认同)

Mur*_*fin 20

你可以使用 Collections.rotate(List<?> list, int distance)

使用Arrays.asList(array)转换为List

更多信息:https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#rotate( java.util.List,% 20int)


Ben*_*Ben 6

只是为了完整性:自 Java 8 以来的流解决方案。

final String[] shiftedArray = Arrays.stream(array)
        .skip(1)
        .toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

我想我坚持了System.arraycopy()你的情况。但最好的长期解决方案可能是将所有内容转换为不可变集合(GuavaVavr),只要这些集合是短暂的。

  • `.skip(n)` 不会删除前 n 个元素吗? (3认同)

luk*_*spp 5

您可以使用这样的模块使此功能更加通用,而不是移动一个位置。

int[] original = { 1, 2, 3, 4, 5, 6 };
int[] reordered = new int[original.length];
int shift = 1;

for(int i=0; i<original.length;i++)
     reordered[i] = original[(shift+i)%original.length];
Run Code Online (Sandbox Code Playgroud)