【问题标题】:Trying to reverse an array in Java [duplicate]试图在Java中反转数组[重复]
【发布时间】:2013-08-29 17:03:11
【问题描述】:

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

【问题讨论】:

  • 总之,有很多方法可以做到这一点。但是按照您的方式进行操作,您可能需要将 for 循环重组为 for(int i = 1; i < 5; i++)

标签: java arrays


【解决方案1】:

`问题是你覆盖了你的索引,最后你得到了和你一开始设置的相同的值。对于您的情况,程序的工作方式如下:

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

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

【讨论】:

  • 绝对有帮助!我特别想了解为什么我的代码不起作用
  • 我会很感激接受的问题或至少一个赞成票 :)
【解决方案2】:

您可以执行以下操作:(不需要额外的库)

List aList = Arrays.asList(yourArray)
Collections.reverse(aList);
yourArray = aList.toArray()

【讨论】:

    【解决方案3】:
    ArrayUtils.reverse(num);
    

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

    【讨论】:

    • 没关系,但我相信对于初学者来说,那些基本项目应该省略外部库。这些肯定更优化,但基础仍然是基础。
    【解决方案4】:
    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】:

      您在第二个 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 没问题,如果您没有其他问题并且对此答案感到满意,您可以单击我的分数下方的复选标记将答案标记为已接受。或者随时提出更多问题等。
      【解决方案6】:

      其实你的程序出错的是num[i - 1] = num[num.length - i];这个语句。

      什么是?只需将 num[0] 替换为 num[4] 并且 num[0] 将永远丢失。这就是为什么你失去了 55 的价值。解决方案是使用第二个数组来存储 Kon 建议的反向值。

      【讨论】:

        【解决方案7】:

        你可以交换数组的前后元素。

        这样可以节省空间。

        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?
        • 因为你只需要经过一半的数组就可以将它们交换到位。 :)
        • 您不需要遍历整个数组,因为您在每次迭代期间交换了两个元素。因此,array.length / 2.
        • 哦,好的。谢谢大家:)
        • @user2056083 最好的感谢方式是接受答案,如果它对你有用,它很简单:)
        猜你喜欢
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        相关资源
        最近更新 更多