在 java 中移动数组列表的元素
Shift elements of array list in java
所以我试图将数组向右移动,使 x 显示为 4、5、6、7、1、2、3。我认为我的算法是正确的,但由于某些原因它不会' t return x 并跳过 "x = rotate(x, 3)" 行之后的任何内容。任何帮助或解释将不胜感激。
public class Ex1sub3 {
public static void main(String[] args){
double[] x = {1, 2, 3, 4, 5, 6, 7};
System.out.println("Before rotation: ==============================");
for (int i = 0; i < x.length; i++)
{
System.out.println("x[" + i + "]: " + x[i]);
}
x = rotate(x, 3);
System.out.println("After rotation:==============================");
for (int i = 0; i < x.length; i++)
{
System.out.println("x[" + i + "]: " + x[i]);
}
}
private static double[] rotate(double[] x, int n){
int l = x.length;
double [] r = x;
int c = 0;
int rotation;
int startRotation = 0;
for (c = 0; c < l; c++)
{
rotation = c+n;
while (rotation < l-n)
{
x[c] = r[rotation];
}
if (rotation >= l-n)
{
x[c] = r[startRotation];
startRotation++;
}
}
return x;
}
}
这是调试器可以帮助您查看的地方,但是,一个问题是您覆盖了要复制到的第一个值而不保留它。例如
假设你有两个元素,{ 1, 2 }
你做的第一件事是复制 x[1] = x[0]
数组是 { 1, 1 }
即你写了一个你不能得到后者的值。相反,您需要保留要复制的值。例如
double d = x[1];
x[1] = x[0];
x[0] = d;
当您移动 n
时,这会更复杂,但可以做到。一个更简单的解决方案是在旋转之前获取数组的副本。
您的程序不会跳过任何行,但会卡在您的 rotate(...)
函数中。我看不出有什么办法可以离开内部 while
循环,因为条件中的所有变量都在主体中保持不变。但正如@Peter Lawrey 已经提到的:调试器在程序流神秘的情况下可能会很有用。
所以我试图将数组向右移动,使 x 显示为 4、5、6、7、1、2、3。我认为我的算法是正确的,但由于某些原因它不会' t return x 并跳过 "x = rotate(x, 3)" 行之后的任何内容。任何帮助或解释将不胜感激。
public class Ex1sub3 {
public static void main(String[] args){
double[] x = {1, 2, 3, 4, 5, 6, 7};
System.out.println("Before rotation: ==============================");
for (int i = 0; i < x.length; i++)
{
System.out.println("x[" + i + "]: " + x[i]);
}
x = rotate(x, 3);
System.out.println("After rotation:==============================");
for (int i = 0; i < x.length; i++)
{
System.out.println("x[" + i + "]: " + x[i]);
}
}
private static double[] rotate(double[] x, int n){
int l = x.length;
double [] r = x;
int c = 0;
int rotation;
int startRotation = 0;
for (c = 0; c < l; c++)
{
rotation = c+n;
while (rotation < l-n)
{
x[c] = r[rotation];
}
if (rotation >= l-n)
{
x[c] = r[startRotation];
startRotation++;
}
}
return x;
}
}
这是调试器可以帮助您查看的地方,但是,一个问题是您覆盖了要复制到的第一个值而不保留它。例如
假设你有两个元素,{ 1, 2 }
你做的第一件事是复制 x[1] = x[0]
数组是 { 1, 1 }
即你写了一个你不能得到后者的值。相反,您需要保留要复制的值。例如
double d = x[1];
x[1] = x[0];
x[0] = d;
当您移动 n
时,这会更复杂,但可以做到。一个更简单的解决方案是在旋转之前获取数组的副本。
您的程序不会跳过任何行,但会卡在您的 rotate(...)
函数中。我看不出有什么办法可以离开内部 while
循环,因为条件中的所有变量都在主体中保持不变。但正如@Peter Lawrey 已经提到的:调试器在程序流神秘的情况下可能会很有用。