繁体   English   中英

java-按一列总数对二维数组排序

[英]java - Sorting a 2d array by the total of one column issue

我正在尝试创建一个方法,该方法将采用一个随机填充的2D数组(每行是一个工人,每列是他们在整个夏天工作的一年。数组中的每个元素都是他们在那个夏天赚了多少钱)并进行排序由每个夏天赚最多钱的工人工作,从那里到最大到最少排序。 这是课程:

import java.util.Scanner;

public class SummerStats
{

int[][] salaries;

SummerStats(int people, int years)
{
  int i;
  int j;
  salaries = new int[years][people];

  for (i = 0; i < salaries.length; i++) // initialize salaries[][] with random salaries
  {
     for (j = 0; j < salaries[i].length; j++)
     {
        salaries[i][j] = (int)(Math.random() * 1001);
     }
  }

}

// I have omitted a few methods here that are not relevant to this question

     // method returns sorted array by earnings of a person over all years
   public int[][] sortedEarnings()
{
  int i = 0;
  int j = 0;
  int[][] sorted = new int[salaries.length][salaries[i].length];
  int rowSum = 0;
  int row[][] = new int[2][salaries.length];
  boolean flag = true;
  int temp = 0;


  // sorted will be a copy of salaries, then be sorted by total of each row
  for (i = 0; i < salaries.length; i++)
  {
     for (j = 0; j < salaries[i].length; j++)
     {
        sorted[i][j] = salaries[i][j];
     }
  }

  // sum rows   
  for (i = 0; i < sorted.length; i++)
  {
     for (j = 0; j < sorted[i].length; j++)
     {
        rowSum = rowSum + sorted[i][j];
     }
     row[1][i] = rowSum;
     rowSum = 0;
  }

  // set worker index
  i = 0;
  for (j = 0; j < row[i].length; j++)
  {
     row[i][j] = (j + 1);
  }

  // sort by total earned for each worker
  i = 1; 
  while (flag)
  {
     flag = false;
     for (j = 0; j < row[i].length - 1; j++)
     {    
        if (row[i][j] < row[i][j + 1]) // if total amount is less than next position then swap
        {
           temp = row[i - 1][j]; // only need to sort the indeces, not the actual sums
           row[i - 1][j] = row[i - 1][j + 1];
           row[i - 1][j + 1] = temp;
           flag = true;
        }
     }
  }


  return row; 
 }

}

现在的想法是,您创建与随机生成的数组相同的数组,然后创建rowSum,该行仅找到每个工人总薪水的总和,创建工人数的索引,然后按薪水之和排序并换出工人数相应地。 出于某种原因,我的冒泡排序无法正常工作,我尝试使用两个for循环以及while循环的想法(目前会导致无休止的循环,所以要小心)。

如果有人能找到这种排序的问题或为我提供更好的排序方法,那就太好了!

您的salaries 2D数组反转了。 你说:

每行是一个工人,每列是一年

但是您将其分配为new int[years][people] ,这意味着years是行, people是列,并且如果您尝试对外部数组进行排序,那么您将跨年进行排序。

更改为new int[people][years] 然后,您可以使用Arrays.sort(T[] a, Comparator<? super T> c)对外部数组进行Arrays.sort(T[] a, Comparator<? super T> c)

Arrays.sort(salaries, new Comparator<int[]>() {
    @Override
    public int compare(int[] worker1, int[] worker2) {
        int total1 = sum(worker1);
        int total2 = sum(worker2);
        return Integer.compare(total1, total2);
    }
});

使用以下辅助方法:

static int sum(int[] worker) {
    int sum = 0;
    for (int salary : worker)
        sum += salary;
    return sum;
}

它不会特别快,因为每次比较都必须重新求和。 为了改善这一点,您应该创建一个Worker类,而不是依赖于2D数组。

然后,您可以使Worker类缓存/预先计算totalSalary ,并使其实现Comparable ,因此您不需要Comparator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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