我是Java的新手。我写了这个程序来反转一个数组:
public class Reverse {
public static void main(String[] args) {
int num[] = {55, 2, 37, 9, 8};
System.out.println("Original array is: ");
for (int i : num)
System.out.print(i + " ");
for (int i = 1 ; i != 5; i++) {
num[i - 1] = num[num.length - i];
}
System.out.println("\nReversed array is: ");
for (int i : num)
System.out.print(i + " ");
System.out.println(" ");
}
}
但我得到以下结果。你们知道我做错了吗?
原始数组是: 55 2 37 9 8 反转数组是: 8 9 37 9 8
答案 0 :(得分:2)
您正在第二个for循环中复制原始数组上的值,SIMPLEST(读取:不一定是最佳或最有效的)解决方案是创建一个新数组并将值复制到那里。
int[] backwardsArray = new int[5];
for (int i = 0; i < 5; i++) {
backwardsArray[i] = num[4-i];
}
这将按顺序进行以下值赋值:
backwardsArray[0] = num[4];
backwardsArray[1] = num[3];
backwardsArray[2] = num[2];
backwardsArray[3] = num[1];
backwardsArray[4] = num[0];
通常,您应该始终使用调试器来进入代码,以了解它为什么不像您期望的那样运行。
答案 1 :(得分:2)
您可以交换阵列的前后元素。
这样可以节省空间。
int[] array = {1, 2, 3, 4, 5};
for (int i = 0; i < array.length/2; i++)
{
int tmp = array[i];
array[i] = array[array.length - i - 1];
array[array.length - i - 1] = tmp;
}
// array is now reversed in place
如果您不想更改原始数组的内容,可以将其复制到一个长度相等的新数组中:
int[] array = {1, 2, 3, 4, 5};
int[] reversedArray = new int[array.length];
for (int i = 0; i < array.length; i++)
{
reversedArray[i] = array[array.length - i - 1];
}
// print out contents of reversedArray to see that it works
答案 2 :(得分:1)
您可以执行以下操作:(不需要其他库)
List aList = Arrays.asList(yourArray)
Collections.reverse(aList);
yourArray = aList.toArray()
答案 3 :(得分:0)
实际上你的程序出了什么问题num[i - 1] = num[num.length - i];
这句话。
是什么?只需用num [4]替换num [0],num [0]永远丢失。这就是你失去价值55的原因。对此的解决方法是使用第二个数组来存储Kon建议的反向值。
答案 4 :(得分:0)
public static void main(String[] argc) {
int num[] = {55, 2, 37, 9, 8};
System.out.println("Original array is: ");
for (int i : num)
System.out.print(i + " ");
for (int i = 0 ; i < num.length / 2; i++) {
int temp = num[i];
num[i] = num[num.length -1 - i];
num[num.length - i - 1] = temp;
}
System.out.println("\nReversed array is: ");
for (int i : num)
System.out.print(i + " ");
System.out.println(" ");
}
答案 5 :(得分:0)
ArrayUtils.reverse(num);
我会使用Appache Common库。这既方便又无后顾之忧。
答案 6 :(得分:0)
`问题是你要覆盖你的索引,最后,你得到的是你在开始时设置的相同值。对于您的情况,程序的工作方式如下:
num[4] -> num[0] -- 8 overwrites 55, num = {8,2,37,9,8}
num[3] -> num[1] -- 9 overwrites 2, num = {8,9,37,9,8}
num[2] -> num[2] -- 37 gets set to same index, num = {8,9,37,9,8}
num[1] -> num[3] -- 9 gets set to overwrited value of 2 (now 9), num = {8,9,37,9,8}
num[0] -> num[4] -- 8 gets set to overwrited value of 55 (now 8), num = {8,9,37,9,8}
最简单的理解解决方案是 (使用您的代码):
int reversedArray[] = new int[num.Length];
for (int i = 1 ; i != 5; i++) {
reversedArray[i - 1] = num[num.length - i];
}
关于代码的一些提示:
{object type}[] array = ...
代替{object type} array[]
。虽然它有效但如果您要转移到C#,这可能会给您带来麻烦。另一方面,这个是正确的c / c ++语法。for
循环中,不是将i
初始化为1,而是将其从0开始,因为所有数组都是从零开始的(这意味着第一个索引的数字为0)。这样,您只能使用i
索引数组,而不必另外减去它。 i < array.Length
。这将在您输入的数字之前结束1个数字。对于您的示例,它将从0循环到4,当它达到5时,它将不再重复循环。同样,您的语法有效,但另一个更合乎逻辑。此外,它可能会发生(在更复杂的程序场景中)以这种方式循环不会给你预期的结果,因为非常简单的错误会引起巨大的麻烦。更正确的解决方案 (将我的提示应用到您的代码中):
int[] reversedArray = new int[num.Length];
for (int i = 0 ; i < num.Length; i++) {
reversedArray[i] = num[num.length - i];
}
我看到在我写这篇文章的时候,添加了一些新问题,但我希望我的帮助你能理解你的错误是什么以及为什么会这样。