Kick Buttowski
Kick Buttowski

Reputation: 6739

Convert 1D to 2D java.lang.ArrayIndexOutOfBoundsException

I try to convert 1D to 2D array, but I keep getting java.lang.ArrayIndexOutOfBoundsException, and I have tried whatever I could find on the stackoverflow or internet, but I do not understand why I have this issue?

public class Arrayto2DArray {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int[] a = {0,1, 6, 83, 4, 5, 12, 7};
        int[][] b = new int[4][4];

          for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                 b[i][j]=0;
                 System.out.print(b[i][j]);
            }
            System.out.println();
          }   

        System.out.println("--------------------------");


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < b[i].length; j++) {
                try{
                b[i][j] = a[i+j*4];
                }catch(Exception e){
                    e.printStackTrace();
                    System.out.println(e);
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(b[i][j]);
            }
                System.out.println();
        }    
    }
}

I kind of know why I get this error and it because of this line

 b[i][j] = a[i+j*4];

but I cannot come up any formula better than this.

Upvotes: 0

Views: 181

Answers (4)

Ashish
Ashish

Reputation: 520

Consider the second for-loop Lets say when i = 3 and j= 3 a[i+j*4] evaluates to a[15] which is out of the array

When you declare you 2-d array, you specified int[][] b = new int[4][];, meaning that the first inner for loop for (int j = 0; j < b[i].length; j++) should result in a NullPointerException since b[i].length has no predefined length. Before intering the inner for loop, you should define the size of each b[i] like b[i] = new int[somenumber]

In regards to convert the 1d loop to a 2d, you need to define the rule around spliting it into the 2-d array. Then accordingly the second for loop need modification

EDIT:You modified your code to have an int[4][4] array, which means you have 16 placeholders. Your 1-d array contain only 8 placeholders. It depends on how you want to sort the array, like it can be

b  0   1   2   3
0  0   1   6   83
1  4   5   12  7
2  0   0   0   0
3  0   0   0   0

or any other pattern

Assuming the length of 1-d array is 8 and the total index of 2-d array is 16, the following is more of a general solution:

public static void main(String[] args) {
        // TODO code application logic here
        int[] a = { 0, 1, 6, 83, 4, 5, 12, 7 };
        int[][] b = new int[4][4];

        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                b[i][j] = 0;
                System.out.print(b[i][j] + "\t");
            }
            System.out.println();
        }

        System.out.println("--------------------------");

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < b[i].length; j++) {
                try {
                    if ((j + i * 4) < a.length)
                        b[i][j] = a[j + i * 4];
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println(e);
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(b[i][j] + "\t");
            }
            System.out.println();
        }
    }

Upvotes: 2

Masudul
Masudul

Reputation: 21961

Your correct formula should be like.

 int[] a = {0,1, 6, 83, 4, 5, 12, 7};
 int[][] b = new int[4][2];

 int k=0;
 for (int i = 0; i < b.length; i++) { // Column of 2D array
    for (int j = 0; j < b[0].length; j++) { // Row of 2D array
         b[i][j]= a[k++];
         System.out.println(b[i][j]);
    }
 }

Edit:

For general case, If your row is fixed at 4 but column is not fixed than your 2D conversion formula should be like below.

    int col = a.length / 4;
    int remainder = a.length % 4;
    if (remainder > 0) {
        col = col + 1; // Get the correct column size.
    }
    int[][] b = new int[4][col];
    int k = 0;
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < col; j++) {
            if (k < a.length) {
               b[i][j] = a[k];
               System.out.println(b[i][j]);
            }
            k++;
        }
    }

Upvotes: 0

Lahiru Prasanna
Lahiru Prasanna

Reputation: 1092

I think your code should change like this

public class Arrayto2DArray {


    public static void main(String[] args) {
        // TODO code application logic here
        int[] a = {0,1, 6, 83, 4, 5, 12, 7};
        int[][] b = new int[4][2];

          for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                 b[i][j]=0;
                 System.out.print(b[i][j]);
            }
            System.out.println();
          }   

        System.out.println("--------------------------");


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < b[i].length; j++) {
                try{

                    b[i][j] = a[i+j*4];
                }catch(Exception e){
                    e.printStackTrace();
                    System.out.println(e);
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 2; j++) {
                System.out.print(b[i][j]+" ");
            }
                System.out.println();
        }    
    }
}

Upvotes: 0

cptdanko
cptdanko

Reputation: 842

What is wrong is your 2D array is a 4*4, so that means for each index, there will be 4 elements i.e. say values. So there would be a total of 16 values, so you would need a 1D array with 16 elements for the above code to work. Right now you have only 8 values in your 1D array.

Upvotes: 0

Related Questions