试图转置一个数组,但让数组越界

时间:2014-04-10 04:31:48

标签: java for-loop matrix multidimensional-array

我正在尝试转换2D数组。水平行的内容将传输到垂直列。

public static void change(short image[])
{

   int arrayLength = 29; // row length
   int arrayWidth = 10; // column length
   // array with values
   short[][] decompressedImage = new short[arrayLength][arrayWidth]; 

   // array to store transposed image
   short[][] transposedImage = new short[arrayWidth][arrayLength];

   // store transposed values

   for (int i=0;i<arrayWidth; i++){
      for (int j=0;j<arrayLength; j++){
         transposedImage[j][i]=decompressedImage[i][j];
      }
   }
}

5 个答案:

答案 0 :(得分:1)

这里有一个旋转如何工作的例子,旋转实际上只是循环的中间位置(在评论下方),我也用输出的两个方向做了:

    String[][] matrix = {{"A","B","C"},{"D","E","F"},{"G","H","I"}};
String[][] tmp = new String[matrix.length][matrix.length];

    //PRINT BEFORE ROTATION
for(int row=0; row<matrix.length;row++){
    for(int col=0; col<matrix.length;col++){
        System.out.print(matrix[row][col] + "  ");
    }
    System.out.println();
}

    //HERE IS THE ROTATION
for(int row=0; row<matrix.length;row++){
    for(int col=matrix.length-1; col>=0;col--){
        tmp[col][row] = matrix[row][matrix.length-1-col];
    }
}

    //PRINT AFTER ROTATION
System.out.println("Rotated");
for(int row=0; row<matrix.length;row++){
    for(int col=0; col<matrix.length;col++){
        System.out.print(tmp[row][col] + "  ");
    }
    System.out.println();
}

<强>输出:

A  B  C  
D  E  F  
G  H  I  

Rotated

C  F  I  
B  E  H   
A  D  G  

如果你想以第二种方式旋转它。

替换for //HERE IS THE ROTATION

的for循环

由此:

    for(int row=matrix.length-1; row >= 0; row--){
    for(int col=0; col<matrix.length;col++){
        tmp[col][row] = matrix[matrix.length-1-row][col];
    }
}

<强>输出:

A  B  C  
D  E  F  
G  H  I  

Rotated

G  D  A  
H  E  B  
I  F  C  

答案 1 :(得分:0)

如果lowLength为29,则只能访问28。 因为索引从0开始。

更改

i < arrayWidth --> i < arrayWidth - 1
i < arrayLength --> i < arrayLength - 1

这只是一种可能性。

答案 2 :(得分:0)

更改以下行:

 short[][] transposedImage = new short[arrayLength][arrayWidth];  

而不是

short[][] transposedImage = new short[arrayWidth][arrayLength];  

这是您更改后的代码:

int arrayLength = 29; // row length
int arrayWidth = 10; // column length
short[][] transposedImage = new short[arrayLength][arrayWidth];
short[][] decompressedImage = new short[arrayWidth][arrayLength];

// store transposed values
for (int i=0;i<arrayWidth; i++){
  for (int j=0;j<arrayLength; j++){
     transposedImage[j][i]=decompressedImage[i][j];
  }
}

答案 3 :(得分:0)

假设arrayLength & arrayWidthlength & width的{​​{1}},循环结构

decompressedImage

实际上符合for (int i=0;i<arrayWidth; i++){ for (int j=0;j<arrayLength; j++){ transposedImage[j][i]=decompressedImage[i][j]; } } 的维度,而不是transposedImage的维度。你的循环变量decompressedImage采用transposedImage的维度。

因此改变陈述

i & j

 transposedImage[j][i]=decompressedImage[i][j];

我想这应该会有所帮助。

答案 4 :(得分:0)

您定义了维度transposedImage的{​​{1}},但是,当您访问该数组时,您将循环到[arrayWidth][arrayLength],注意[arrayLength][arrayWidth]和{{1}你的循环。根据循环,应该是,

i

而不是

j

更正了代码段,

transposedImage[i][j]=decompressedImage[j][i];