【问题标题】:Ranking an array's values from 1 to 10, java?将数组的值从 1 到 10 排序,java?
【发布时间】:2016-03-20 14:38:52
【问题描述】:

我正在尝试将一个数组的值排列到另一个数组中。 所以array1,值(例如array1[3])需要根据值的大小进行排序,然后需要根据数字的大小分配一个从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;

}

除此之外,我不知道该去哪里。我尝试了二维数组,但这很令人困惑。 array1 将显示在 GUI 屏幕上的列中,但根据程序以随机​​顺序显示。但排名将显示在 GUI 中 array1 列中的每个值之外。排名不需要按顺序显示,但需要对array1的值进行排序,并在屏幕下一列的值旁边显示。

【问题讨论】:

  • 你试过Arrays.sort(array1);吗?
  • 是的,需要显示 1 到 10 的排名,但不按顺序显示。因此,如果 array1[1] 的值为 2 且 array1[2] 为 4....它将显示在排名列中:2,1。 1 为最高。干杯:)
  • 这些值是唯一的吗?如果是这样,您可以将其复制到列表中,对其进行排序,然后使用 indexOf 方法?

标签: java arrays sorting


【解决方案1】:

解决此类问题的一种方法:

  • (value, index) 对存储在一个数组中
  • value 对数组进行排序
  • 根据已排序的对数组构建排名数组

类似这样的:

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;
        }
    }

【讨论】:

  • 如果排名相等会怎样?我将如何实现它?
  • 在这种情况下,不是在每次迭代中递增rank,如果值与之前的值相同,则不会递增排名。
  • @TingAli 我为这种情况添加了一个示例实现
【解决方案2】:

您可以将数组排序为最简单的解决方案。您不需要排名列,因为它已经有序。不过,如你所愿。

int[] array1 = new int[]{10, 22, 45, 6, 7, 25};
int[][] ranked = new int[array1.length][2];
for(int i=0; i < array1.length; i++)
    ranked[i][0] = array1[i];
Arrays.sort(array1);

for(int i=0; i < array1.length; i++)
    for(int n=0; n < array1.length; n++)
        if(ranked[n][0] == array1[i] && ranked[n][1] == 0) 
            ranked[n][1] = array1.length-i;
/* Result
10 # 4
22 # 3
45 # 1
6 # 6
7 # 5
25 # 2
*/

【讨论】:

  • 它现在应该可以工作了,最后修复了一个。 array1 成为临时数组,但将原始顺序中的值复制到排名列表中。重复值无关紧要。
  • 我应该改变什么才能使这项工作与重复值一起工作(相同的值具有相同的等级)
【解决方案3】:

您可以迭代 array1 并将其值存储在 TreeMap 作为键和迭代计数器(此处为数组索引)作为其值。 TreeMap 将根据提供的键自行排序;您可以遍历 TreeMap 并打印值,这些是您对应的排名。

int[] array1 = new int[]{10, 22, 45, 6, 7, 25};
TreeMap<Integer,Integer> map = new TreeMap<>();
for(int i=0;i<array1.length;i++) {
    map.put(array1[i],i);
}
for(int value : map.values()) {
    //print ranks in order of array values
    System.out.println(value);
}

【讨论】:

    【解决方案4】:

    ashfaq 提供的方法效果很好,但您应该知道有两种类型的排名可能。我需要另一种类型,所以为了完整性,我也提供了这种解决方案。

    先说说两种排名。

    在 R 编程语言中,这是两个不同的函数(请注意,R 索引从 1 开始,而不是从 0):

    • order(5,6,4) 将给出 3,1,2,因为第三个索引处的数字比第一个索引处的数字最低,然后是第二个索引处的数字。
    • rank(5,6,4) 将给出 2、3、1,因为 5 是第二小的数字,6 是第三小的数字,而 4 是第一小的数字。

    现在,ashfaq 的解决方案给出了通过 order() 在 R 中实现的功能。 下面是一个模仿 R 的 rank() 行为的解决方案:

        int[] array1 = new int[] { 10, 22, 45, 6, 7, 25 };
        int[] sortedArray = array1.clone();
        Arrays.sort(sortedArray);
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for (int i = 0; i < array1.length; i++) {
            map.put(sortedArray[i], i);
        }
    
        for (int i = 0; i < array1.length; i++) {
            sortedArray[i] = map.get(array1[i]);
            System.out.println(sortedArray[i]);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多