Search code examples
javaarrayssortingjgrasp

Java - Sorting a 2D Array by Row Sum


Trying to write a method that swaps the rows of a 2D array in order of increasing row sum.

For example, if I have the following 2d array:

int [][] array = {4,5,6},{3,4,5},{2,3,4};

I would want it to output an array as so:

{2 3 4}, {3 4 5}, {4 5 6}

Methodology:

a.) take the sums of each row and make a 1D array of the sums

b.) do a bubble sort on rowSum array

c.) swap the rows of the original array based on the bubble sort swaps made

d.) then print the newly row sorted array.

Here's my code so far:

      public void sortedArrayByRowTot() {
        int [][] tempArray2 = new int [salaryArray.length [salaryArray[0].length];

        for (int i = 0; i < tempArray2.length; i++) {
          for (int j = 0; j < tempArray2[i].length; j++) {
            tempArray2[i][j] = salaryArray[i][j];
          }
        }

        int [] rowSums = new int [tempArray2.length];
        int sum = 0;
        for (int i = 0; i < tempArray2.length; i++) {
          for (int j = 0; j < tempArray2[i].length; j++) {
            sum += tempArray2[i][j];
          }
          rowSums[i] = sum;
          sum = 0;
        }

        int temp;
        int i = -1;
        for(int j = rowSums.length; j > 0; j--){
          boolean isSwap = false;
          for (i = 1; i < j; i++) {
            if(rowSums[i-1] > rowSums[i]) {
              temp = rowSums[i-1];
              rowSums[i-1] = rowSums[i];
              rowSums[i] = temp;
              isSwap = true;
            }
          }

          if(!isSwap){
            break;
          }
        }

        for (int k = 0; k < tempArray2.length; k++) {
          temp = tempArray2[i-1][k];
          tempArray2[i-1][k] = tempArray2[i][k];
          tempArray2[i][k] = temp;
        }

        for (int b = 0; b < tempArray2.length; b++) {
          for (int c = 0; c < tempArray2[b].length; c++) {
            System.out.print(tempArray2[b][c] + " ");
          }
        }
      }
    }

Not sure if I am doing part c of my methodology correctly?

It keeps saying "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2"


Solution

  • I was able to solve my question. Thanks.

        public void sortedArrayByRowTot() {
          //Creates tempArray2 to copy salaryArray into
          int [][] tempArray2 = new int [salaryArray.length][salaryArray[0].length];
    
          //Copies salaryArray into tempArray2
          for (int i = 0; i < salaryArray.length; i++) {
            for (int j = 0; j < salaryArray[i].length; j++) {
              tempArray2[i][j] = salaryArray[i][j];
            }
          }
    
          //Creates rowSum array to store sum of each row
          int [] rowSums = new int [tempArray2.length];
          for (int i = 0; i < tempArray2.length; i++) {
            for (int j = 0; j < tempArray2[0].length; j++) {
              rowSums[i] += tempArray2[i][j];
            }
          }
    
          //Modified Bubble Sort of rowSum array (highest to lowest values)
          int temp;
          int i = 0;
          for(int j = rowSums.length; j > 0; j--){
            boolean isSwap = false;
            for (i = 1; i < j; i++) {
              if(rowSums[i-1] < rowSums[i]) {
                temp = rowSums[i-1];
                rowSums[i-1] = rowSums[i];
                rowSums[i] = temp;
                isSwap = true;
                //swaps rows in corresponding tempArray2 
                int [] temp2 = tempArray2[i-1];
                tempArray2[i-1] = tempArray2[i];
                tempArray2[i] = temp2;
              }
            }
    
            if(!isSwap){
              break;
            }
          }  
    
          //Prints sorted array 
          System.out.println("Sorted array: ");
          for (i = 0; i < tempArray2.length; i++) {
            for (int j = 0; j < tempArray2[i].length; j++) {
              System.out.print("$"+ tempArray2[i][j] + " ");
            }
            System.out.println();
          }
        }