尝试在Java中反转一个数组

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 2 55


总之,有很多方法可以完成这个任务。但是按照你的方式,你可能需要重构你的for循环为for(int i = 1; i < 5; i++) - leigero
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];

通常情况下,您应该始终使用调试器来逐步执行代码,以了解为什么它的行为不符合您的预期。


感谢您的迅速回复 :) - user2056083
@user2056083 没问题,如果您没有进一步的问题并对这个答案感到满意,您可以点击我的分数下方的检查标记以标记答案为已接受。或者随时提出更多问题等。 - Kon

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

谢谢。我不明白 -> array.length/2。为什么要将数组长度除以2? - user2056083
因为你只需要遍历数组的一半就可以在原地交换它们。 :) - corgichu
1
你不需要迭代整个数组,因为在每次迭代中你都会交换两个元素。因此,只需要迭代数组长度的一半即可,即array.length / 2。 - user1639464
1
@user2056083 如果答案对您有帮助,请接受它并表示感谢,这非常简单 :) - 0decimal0

1
你可以采取以下步骤:(无需额外的库)
List aList = Arrays.asList(yourArray)
Collections.reverse(aList);
yourArray = aList.toArray()

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(" ");
    }

0
ArrayUtils.reverse(num);

我会使用Appache Common库。它既方便又无忧。


没问题,但我认为对于初学者来说,在基础项目中应该避免使用外部库。虽然这些库肯定更加优化,但基础始终是基础。 - Marko Gresak

0

实际上,你的程序中有问题的是这个语句:num[i - 1] = num[num.length - i];

它的作用是什么?简单来说,它将num[0]替换为num[4],而num[0]永远丢失了。这就是为什么你会丢失值55的原因,解决方法是使用第二个数组来存储反转值,正如Kon所建议的那样。


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

以下是关于您的代码的一些小贴士:

  • 请使用 {对象类型}[] 数组 = ... 而不是 {对象类型} 数组[]。虽然后者能够运行,但如果您将来要切换到 C# ,这可能会引起问题。与此相反,前者是 c/c++ 的正确语法。
  • for 循环中,将 i 的初始值设为 0 而不是 1,因为所有的数组都是以零为基础的(即第一个索引号为 0)。这样您就可以仅用 i 索引数组,而不必另外减去 1。
  • 此外,请使用 i < array.Length 作为循环条件。这将在您输入的数字前结束一次循环。对于您的示例,它将从 0 循环到 4,当达到 5 时,它不会再重复循环。虽然您的语法能够工作,但另一种方式更加符合逻辑,并且在更复杂的程序场景下,如果以这种方式循环,则有可能无法获得所期望的结果,因此会因非常简单的错误而导致巨大的麻烦。

更正确的解决方案 (应用我的提示到您的代码中)

int[] reversedArray = new int[num.Length];
for (int i = 0 ; i < num.Length; i++) {
     reversedArray[i] = num[num.length - i];
}

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


它绝对有帮助!我特别想知道为什么我的代码不起作用。 - user2056083
我会非常感激如果您接受了我的问题或者至少给我一个赞 :) - Marko Gresak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接