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)
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)
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)
只是为了完整性:自 Java 8 以来的流解决方案。
final String[] shiftedArray = Arrays.stream(array)
.skip(1)
.toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)
我想我坚持了System.arraycopy()你的情况。但最好的长期解决方案可能是将所有内容转换为不可变集合(Guava、Vavr),只要这些集合是短暂的。
您可以使用这样的模块使此功能更加通用,而不是移动一个位置。
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)