我有一个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名)
我目前有两个dubble数组来达到这个结果,但我认为它会更好,但我找不到。我现在最大的问题是当我们有3个相同的分数:{40,40,40,10}而不是我应该得到的结果{123,123,123,4}
我希望你理解我的问题,当然可以帮助我找到解决方案。
感谢
答案 0 :(得分:3)
首先,创建我们将使用分数排序的索引:
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]);
}
});
请注意,我们使用-
按降序顺序排序。
现在,我们使用indices
订购了我们的分数,并考虑了重复分数的可能性。接下来,我们将收集每个分数的所有指数。我们将通过构建从分数到该分数的索引列表的地图来实现此目的。
Map<Double, SortedSet<Integer>> map =
new HashMap<Double, SortedSet<Integer>>();
for(int i = 0; i < scores.length; i++) {
if(!map.containsKey(scores[i])) {
map.puts(scores[i], new TreeSet<Integer>());
}
map.get(scores[i]).add(indexes[i] + 1);
}
我们使用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, 10, 20]
上运行时,我看到了输出:
40: 1,2
40: 1,2
10: 3
20: 4
和[40, 40, 40, 10]
:
40: 1,2,3
40: 1,2,3
40: 1,2,3
10: 4
和[10, 10, 20, 40]
:
10: 3,4
10: 3,4
20: 2
40: 1
从这里开始,应该很容易修改以获得所需的排名。
让我们来看看它在精神上的运作方式。我们将使用示例[40, 40, 10, 20]
。首先,我们建立索引:
indexes = [0, 1, 2, 3]
然后我们使用分数对索引进行排序;
indexes = [0, 1, 3, 2]
然后我们收集每个分数的所有等级(记住,我们在上一步的索引中添加一个):
map = { 40 : [1, 2], 10 : [4], 20 : [3] }
然后,对于scores
中的每个分数,我们可以在map
中查找所有等级并将其转储到控制台。