【问题标题】:Reverse the rows of a 2d array反转二维数组的行
【发布时间】:2014-02-20 22:19:33
【问题描述】:

昨天我问了一个非常相似的问题,但我有点搞砸了。

我需要将一个数组传递给一个方法,并且在该方法内部我需要交换行,所以如果它是

1 2 3

3 2 1

2 1 3

应该是

3 2 1

1 2 3

3 1 2

使用我现在拥有的代码,它将最后一列正确地交换到第一列位置,然后放置应该是最后一列。

3 1 2

1 3 2

3 2 1

另外,它需要保持空白,因为我需要修改原始数组,所以我不能将它设置为临时数组,但我可以使用临时整数来存储。

这是我现在可以使用的代码

public static void reverseRows(int[][] inTwoDArray)
{
   for (int row = 0; row < inTwoDArray.length; row++)
   {
       for (int col = 0; col < inTwoDArray[row].length; col++)
       {
           int tempHolder = inTwoDArray[row][col];
           inTwoDArray[row][col] = inTwoDArray[row][inTwoDArray[0].length - 1];
           inTwoDArray[row][inTwoDArray[0].length - 1] = tempHolder;
       }
    }
 }

任何帮助都会很棒,我的头发快要拔掉了!谢谢!

【问题讨论】:

  • 首先提取将一维数组反转为方法的算法。这已经使代码更容易理解,并解决了其中一个错误。然后在纸上执行你的逆向算法,注意每条指令中每个变量的值。你会明白哪里错了。
  • @JBNizet 感谢您的回复!我目前正在尝试这样做。所以你的意思是我会做int tempHolder = inTwoDArray[row]
  • 算法应该是:对二维数组中的每一行,反转该行。在 Java 中:for (int[] row : inTwoDArray) { reverse(row); }。这不是更容易阅读和理解吗?现在你只需要专注于 reverse() 方法的实现,它处理一维 int[] 数组。
  • @JBNizet 谢谢,谢谢,非常感谢!您让我理解了它为什么起作用,并且 kuba 用代码说明了它。成功了,非常感谢你们和其他所有人!

标签: java arrays multidimensional-array


【解决方案1】:

首先,如何反转单个一维数组:

for(int i = 0; i < array.length / 2; i++) {
    int temp = array[i];
    array[i] = array[array.length - i - 1];
    array[array.length - i - 1] = temp;
}

请注意,您必须在阵列的一半处停止,否则您将交换两次(与您开始时的相同)。

然后放到另一个for循环中:

for(int j = 0; j < array.length; j++){
    for(int i = 0; i < array[j].length / 2; i++) {
        int temp = array[j][i];
        array[j][i] = array[j][array[j].length - i - 1];
        array[j][array[j].length - i - 1] = temp;
    }
}

另一种方法是使用一些库方法,例如来自ArrayUtils#reverse():

ArrayUtils.reverse(array);

然后再放入一个循环:

for(int i = 0; i < array.length; i++){
   ArrayUtils.reverse(array[i]);
}

【讨论】:

  • 非常感谢!!已经连续大约 5 个小时了,所以我的大脑被卡住了,几乎是糊状的。你们救了我!
  • @iHeff 没问题 :) 有时将它画在纸上或调试也会显示问题。
  • 我经常在网站上工作,通常纸是我最好的朋友,但由于某种原因,在使用 java 时很难在纸上说明。一旦我得到更好的理解,虽然我相信它会变得更容易,谢谢你的提示!而且我忘记了如何使用 blueJ 进行调试,然后完全忘记了它的重要性。应该这样做,哎呀。谢谢!! @Kuba Spatny
  • 我想这是正确的:- for(int j = 0; j
  • array[j][i] = array[j][array[j].length - i - 1];数组[j][数组[j].length - i - 1] = temp;而不是 array[j][i] = array[j][array.length - i - 1];数组[j][array.length - i - 1] = temp;
【解决方案2】:

我猜这是最简单的方法,经过尝试和测试 例如,你有

1 2
3 4

你想要的

2 1 
4 3 

您可以反转循环,无需任何额外空间或内置函数。 解决方案:

for(int i =0;i<arr.length;i++) //arr.length=no of rows
{
  for(int j = arr[i].length-1;j>=0;j--)//arr[i].length=no of col in a ith row
    {
        System.out.print(arr[i][j]+" ");
    }
    System.out.println();
}

【讨论】:

    【解决方案3】:

    不确定我是否混淆了哪个数组存储行和哪个列存储....但这应该可以工作(自从我上次完成 Java 以来已经很长时间了,所以请在发现任何错误时对我好点^^):

    public static void reverseRows(int[][] array)
    {
        for (int i = 0 ; i < array.length ; i++) {       // for each row...
            int[] reversed = new int[array[i].length];   // ... create a temporary array that will hold the reversed inner one ...
            for(int j = 0 ; j < array[i].length ; j++) { // ... and for each column ...
                reversed[reversed.length - 1 - j] = array[i][j]; // ... insert the current element at the mirrored position of our temporary array
            }
            array[i] = reversed; // finally use the reversed array as new row.
        }
    }
    

    【讨论】:

    • 看起来很棒,只是我无法为此制作一个临时数组(这是一个课程的程序)我希望我可以,因为我会在几个小时前完成哈哈哈。不过谢谢!! (我没有看到任何错误,但我的 java 不是很先进!)
    【解决方案4】:

    Java 代码:-

    import java.util.Scanner;
    
    public class Rev_Two_D {
    
        static int col;
        static int row;
        static int[][] trans_arr = new int[col][row];
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Scanner sc = new Scanner(System.in);
            int m = sc.nextInt();
            row = m;
            int n = sc.nextInt();
            col = n;
            int[][] arr = new int[row][col];
    
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    arr[i][j] = sc.nextInt();
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
            for (int j = 0; j < arr.length; j++) {
                for (int i = 0; i < arr[j].length / 2; i++) {
                    int temp = arr[j][i];
                    arr[j][i] = arr[j][arr[j].length - i - 1];
                    arr[j][arr[j].length - i - 1] = temp;
                }
            }
    
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      两个 D 数组的反转 - 以相反的顺序打印你的两个 D 数组

      public void reverse(){
          int row = 3;
          int col = 3;
          int[][] arr = new int[row][col];
          int k=0;
          for (int i = 0; i < row; i++) {
              for (int j = 0; j < col; j++,k++) {
                  arr[i][j] = k;
                  System.out.print(arr[i][j] + " ");
              }
              System.out.println();
          }
          System.out.println();
          for (int i = arr.length -1; i >=0 ; i--) {
              for (int j = arr.length -1; j >=0 ; j--) {
                  System.out.print(arr[i][j] + " ");
              }
              System.out.println();
          }
      }
      

      【讨论】:

        【解决方案6】:
        public static void main(String[] args) {
        
            int [][] a={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        
            for(int i=0 ; i<a.length;i++)
            {
                for(int j=0 ; j<a.length;j++)
                {
                    System.out.print(a[i][j]+",");
                }
                System.out.println();
        
            }
            System.out.println("***************************");
            for(int i=0 ; i<a.length;i++)
            {
                for(int j=a.length-1 ; j>=0;j--)
                {
                    System.out.print(a[i][j]+",");
                }
                System.out.println();
        
            }
        
        }
        

        【讨论】:

        • 注意:您的答案/代码的第一行未格式化为代码;你可能想解决这个问题。另外,也许您想将您的评论作为文本添加到答案中。
        【解决方案7】:

        反向二维数组

        public static void main(String[] args) {
        
        int a[][] =  {{1,2,3},
                      {4,5,6},
                      {8,9,10,12,15}
                      };
        
        for(int i=0 ; i<a.length;i++)
        {
            for(int j=0 ; j<a[i].length;j++)
            {
                System.out.print(a[i][j]+",");
            }
            System.out.println();
        
        }
        
        for(int i=0 ; i<a.length;i++)
        {
            for(int j=a[i].length-1 ; j>=0;j--)
            {
                System.out.print(a[i][j]+",");
            }
            System.out.println();
        
        }
        

        【讨论】:

          猜你喜欢
          • 2018-12-15
          • 1970-01-01
          • 2018-03-03
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-28
          相关资源
          最近更新 更多