3

我是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

4

7 回答 7

2

您在第二个 for 循环中将值复制到原始数组上,最简单(阅读:不一定是最好或最有效的)解决方案是创建一个新数组并在那里复制值。

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];

一般来说,您应该始终使用调试器来单步执行您的代码,以了解它为什么没有按您的预期运行。

于 2013-08-27T04:47:47.027 回答
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
于 2013-08-27T04:51:52.750 回答
1

您可以执行以下操作:(不需要附加库)

List aList = Arrays.asList(yourArray)
Collections.reverse(aList);
yourArray = aList.toArray()
于 2013-08-27T04:57:35.983 回答
0

Actually what was wrong in your program is num[i - 1] = num[num.length - i]; this statement.

What is does? simply it replace the num[0] with num[4] and num[0] is lost forever. that's why you are loosing value 55. and solution for this is to use second array to store the reverse value as suggested by Kon.

于 2013-08-27T04:53:09.020 回答
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(" ");
    }
于 2013-08-27T04:55:19.360 回答
0
ArrayUtils.reverse(num);

我会使用Appache 公共库。既方便又省心。

于 2013-08-27T04:56:00.083 回答
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循环中,不是从 1 初始化,而是i从 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];
}

我看到在我写这篇文章的时候,添加了一些新问题,但我希望我的问题能帮助你理解你的错误是什么以及为什么会发生。

于 2013-08-27T05:21:26.833 回答