我正在尝试将一个数组的值排列到另一个数组中。
所以array1
, values(e.g. array1[3]
) 需要根据值的大小进行排序,然后需要分配一个从1到1的值10 取决于数量的大小。排名在 1 到 10 之间。
我试过做选择排序:
public static int[] doSelectionSort(int[] arr){
for (int i = 1; i < arr.length; i++)
{
int index = i;
for (int j = i + 1; j < arr.length - 1; j++)
if (arr[j] < arr[index])
index = j;
int smallerNumber = arr[index];
arr[index] = arr[i];
arr[i] = smallerNumber;
}
除此之外,我不知道该去哪里。我尝试了 2d 数组,但这很令人困惑。 array1 将显示在 GUI 屏幕的一列中,但根据程序以随机顺序显示。但是排名将显示在 GUI 中 array1 列的每个值旁边。排名不需要按顺序显示,但需要对 array1 值进行排名,并显示在屏幕下一列的值旁边。
最佳答案
解决此类问题的一种方法:
- 将
(value, index)
对存储在一个数组中 - 按
值
对数组排序 - 根据已排序的对数组构建等级数组
像这样:
public static int[] calculateRanks(int... arr) {
class Pair {
final int value;
final int index;
Pair(int value, int index) {
this.value = value;
this.index = index;
}
}
Pair[] pairs = new Pair[arr.length];
for (int index = 0; index < arr.length; ++index) {
pairs[index] = new Pair(arr[index], index);
}
Arrays.sort(pairs, (o1, o2) -> -Integer.compare(o1.value, o2.value));
int[] ranks = new int[arr.length];
int rank = 1;
for (Pair pair : pairs) {
ranks[pair.index] = rank++;
}
return ranks;
}
这假设值是唯一的,因此排名也将是唯一的。 如果可能存在重复值,您可以相应地调整设置排名的最后一步。
例如,如果数组中至少有一个值, 这样的事情会起作用:
int[] ranks = new int[arr.length];
ranks[pairs[0].index] = 1;
for (int i = 1; i < pairs.length; ++i) {
if (pairs[i].value == pairs[i - 1].value) {
ranks[pairs[i].index] = ranks[pairs[i - 1].index];
} else {
ranks[pairs[i].index] = i + 1;
}
}
关于java - 将数组的值从 1 排序到 10,java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115069/