【问题标题】:java - Sorting a 2d array by the total of one column issuejava - 按一列问题对二维数组进行排序
【发布时间】:2015-11-30 01:11:22
【问题描述】:

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

如果有人能发现这种排序有什么问题或提供更好的排序方法,那就太好了!

【问题讨论】:

    标签: java arrays sorting 2d bubble-sort


    【解决方案1】:

    您的salaries 二维数组已反转。你说:

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

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

    更改为new int[people][years]。然后您可以使用Arrays.sort(T[] a, Comparator&lt;? super T&gt; 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 类,而不是依赖二维数组。

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

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多