[英]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.