java - 按总共一个列问题对2d数组进行排序

时间:2015-11-30 01:11:23

标签: java arrays sorting 2d bubble-sort

我正在尝试创建一个方法,它将采用随机填充的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循环 想法(目前导致无休止的循环,所以要小心)。

如果有人能找到这类错误或为我提供更好的分类方法,那就太棒了!

1 个答案:

答案 0 :(得分:0)

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

  

每一行都是一名工人,每一列都是一年

但您分配为new int[years][people],这意味着years是行,people是列,如果您尝试对外部数组进行排序,则需要对多年进行排序。

更改为new int[people][years]。然后,您可以使用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。< / p>