从4分得到这个地方

时间:2013-06-29 19:33:51

标签: 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名)

我目前有两个dubble数组来达到这个结果,但我认为它会更好,但我找不到。我现在最大的问题是当我们有3个相同的分数:{40,40,40,10}而不是我应该得到的结果{123,123,123,4}

我希望你理解我的问题,当然可以帮助我找到解决方案。

感谢

1 个答案:

答案 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中查找所有等级并将其转储到控制台。