简体   繁体   中英

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"

As @shmosel said, you can do it like this:

public static void sortedArrayByRowTot() {
    int [][] array = {{4,5,6},{3,4,5},{2,3,4}};
    Arrays.sort(array, Comparator.comparingInt(a -> IntStream.of(a).sum()));
}

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();
      }
    } 

You may try this way. That I have solved.

 public class Solution{
          public static void sortedArrayByRowTot() {
            int [][] salaryArray = { {4,5,6},{3,4,5},{2,3,4} };
            int [][] tempArray2 = new int [salaryArray.length][salaryArray[0].length];

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

            // Buble Sort to store rowSums
            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];
              }
            }

            //Buble Sort by Rows Sum (Lowest Value to Highest)
            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;
              }
            }  
            /** No Need.
            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] + " ");
            }
          }
          }

        public static void main(String[] args) {
            sortedArrayByRowTot();
        }
      }

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