Java 从4分开始得到这个位置

Java 从4分开始得到这个位置,java,arrays,Java,Arrays,我有一个由4个整数组成的数组,代表4个玩家的分数。我想得到另一个数组,它根据玩家的得分为我提供排名 例如: 考虑到分数{10,20,15,40} 我希望排名为{4,2,3,1} 最低分为4级,最高分为1级 最大的问题是当有多个玩家拥有相同的分数时。例如{10,10,20,40}那么我想得到{34,34,2,1}(34因为第三和第四名由两名玩家共享) 另一个例子是{40,40,10,20},它应该给出排名{12,12,4,3}(12代表共享第一和第二名) 目前我有两个双音数组来达到这个结果,但我认

我有一个由4个整数组成的数组,代表4个玩家的分数。我想得到另一个数组,它根据玩家的得分为我提供排名

例如:
考虑到分数{10,20,15,40}
我希望排名为{4,2,3,1}

最低分为4级,最高分为1级

最大的问题是当有多个玩家拥有相同的分数时。例如{10,10,20,40}那么我想得到{34,34,2,1}(34因为第三和第四名由两名玩家共享)

另一个例子是{40,40,10,20},它应该给出排名{12,12,4,3}(12代表共享第一和第二名)

目前我有两个双音数组来达到这个结果,但我认为它可以更好,但我不知道怎么做。我现在最大的问题是当我们有3个相同的分数时:{40,40,40,10}比我应该得到的结果{123123,4}

我希望你能理解我的问题,当然也能帮助我找到解决办法


谢谢

首先,创建我们将使用分数排序的索引:

final double[] scores = // acquire scores
Integer[] indices = new Integer[scores.length];
Arrays.sort(indexes, new Comparator<Integer>() {
    @Override public int compare(Integer i, Integer j) {
        return -Double.compare(scores[i], scores[j]);
    }
});
我们使用
SortedSet
,以便按顺序列出索引,并添加
1
,因为您的排名从1开始,而不是从零开始

现在,如果您对分数进行迭代,您可以从
HashMap
中查找排名

for(int i = 0; i < scores.length; i++) {
    SortedSet<Integer> set = map.get(scores[i]);
    System.out.print(scores[i] + ": ");
    Iterator<Integer> iterator = set.iterator();
    System.out.print(iterator.next());
    while(iterator.hasNext()) {
        System.out.print("," + iterator.next());
    }
    System.out.println();
}
[40,40,40,10]
上:

40: 1,2,3
40: 1,2,3
40: 1,2,3
10: 4
10: 3,4
10: 3,4
20: 2
40: 1
[10,10,20,40]
上:

40: 1,2,3
40: 1,2,3
40: 1,2,3
10: 4
10: 3,4
10: 3,4
20: 2
40: 1
从这里,它应该很容易修改,以获得您想要的排名

让我们来了解一下这在精神上是如何起作用的。我们将使用示例
[40,40,10,20]
。首先,我们构建索引:

indexes = [0, 1, 2, 3]
然后,我们使用分数对索引进行排序

indexes = [0, 1, 3, 2]
然后,我们收集每个分数的所有等级(记住,我们在上一步的索引中添加了一个):


然后,对于
scores
中的每个分数,我们可以在
map
中查找所有等级,并将它们转储到控制台。

我很乐意提供帮助,但我不知道您需要什么。你尝试了什么?你的代码怎么不起作用?@hovercraftfullofels这里一样,我什么都没得到,但是你为什么不使用地图呢?像HashMap一样,决定给出这些数字的点数的算法是什么?我真的不明白你的问题这似乎是一个非常糟糕的建模。使用两个必须保持同步的从属阵列。使用PlayerScore类将玩家与其分数关联,怎么样。将它们放入优先级队列(最大堆),您将始终能够以正确的顺序对它们进行迭代。3/4返回34似乎非常危险。如果你有15名球员,第一名和第二名的位置是相等的怎么办;i、 e.第12条
map = { 40 : [1, 2], 10 : [4], 20 : [3] }