简体   繁体   中英

Transposing a 2D Array Only Works For Rectangular Arrays - Java

I have a class with a method that transposes an array given the array, rows, and columns

public class Transpose {

public static void main(String[] args) {
    int[][] array = new int[6][5];

    System.out.println("Original:");
    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length; j++)
        {
            array[i][j] += i+1;
            System.out.print(array[i][j] + " ");
        }
        System.out.println();
    }
    System.out.println();
    transpose(array, 6, 5);
}

public static void transpose(int[][] array, int arrayRows, int arrayColumns)
{
    int[][] transposedArray = new int[arrayRows][arrayColumns];
    System.out.println("Transposed:");
    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length; j++)
        {
            transposedArray[i][j] = array[j][i];
            System.out.print(transposedArray[i][j] + " ");
        }
        System.out.println();
    }
}
}

The output I get looks like this:

Original:
1 1 1 1 1 
2 2 2 2 2 
3 3 3 3 3 
4 4 4 4 4 
5 5 5 5 5 
6 6 6 6 6 

Transposed:
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 

I realized that the method only works when the values of arrayRows and arrayColumns are the same value, for example: 6, 6 or 5, 5. I tried to place the values opposite of each other, the rows in columns and vice versa, however it did not work. How can I get the method to work for non-rectangular/square arrays?

See line comments for explanation. Those are the only lines I modified.

public static void transpose(int[][] array, int arrayRows, int arrayColumns) {
    int[][] transposedArray = new int[arrayColumns][arrayRows]; //swap number of rows and columns
    System.out.println("Transposed:");
    for (int i = 0; i < transposedArray.length; i++) { //take the length of transposedArray, not array
        for (int j = 0; j < transposedArray[i].length; j++) { //take the length of transposedArray, not array
            transposedArray[i][j] = array[j][i];
            System.out.print(transposedArray[i][j] + " ");
        }
        System.out.println();
    }
}

You need to swap the places of arrayRows and arrayColumns in the transposed matrix, because the new matrix is supposed to be a [5][6] instead of a [6][5] .

So your line of

int[][] transposedArray = new int[arrayRows][arrayColumns];

becomes

int[][] transposedArray = new int[arrayColumns][arrayRows];

We also need to swap i and j in the following statement, because the loops are following the indices of the original matrix:

transposedArray[i][j] = array[j][i];

to

transposedArray[j][i] = array[i][j];

And lastly, you can't print the transposed matrix while you're creating it as you're doing now, because you're just re-printing the original matrix that way. I suggest printing the matrix after you're done creating it.

With these changes, your code ends up like this:

public static void main(String[] args) {
    int[][] array = new int[6][5];

    System.out.println("Original:");
    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length; j++)
        {
            array[i][j] += i+1;
            System.out.print(array[i][j] + " ");
        }
        System.out.println();
    }
    System.out.println();
    transpose(array, 6, 5);
}

public static void transpose(int[][] array, int arrayRows, int arrayColumns)
{
    int[][] transposedArray = new int[arrayColumns][arrayRows];
    System.out.println("Transposed:");
    for(int i = 0; i < array.length; i++)
    {
        for(int j = 0; j < array[i].length; j++)
        {
            transposedArray[j][i] = array[i][j];
        }
    }
    for(int i = 0; i < transposedArray.length; i++) { //print the transposed matrix
        for(int j = 0; j < transposedArray[i].length; j++) {
            System.out.print(transposedArray[i][j] + " ");
        }
        System.out.println();
    }
}

You can see a working example here .

for(int i = 0; i < array.length; i++) // should count the number of rows. = 6 iterating from 0 ... 5

for(int j = 0; j < array[i].length; j++) // should count the number of columns = 5

iterate from 0..4

transposedArray[i][j] = array[j][i];

to access 6 ... you need j=5 ; i = 0...4 your loops are not able to access the values

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM