根据分数查找赢家,输家和并列玩家

时间:2019-04-28 22:11:23

标签: java

给出一个球员列表,我试图确定哪个球员得分最高(获胜者),哪个球员并列(如果有),然后推断剩下的球员是一场比赛的输家。

我尝试过实施一个球员比较器,按照得分从高到低的顺序对每个球员进行排序。当然,这将有助于找到赢家和输家。但是我不知道该从哪里去。

我的第一个想法是遍历玩家列表并执行某种冒泡排序算法,但老实说我不知道​​。我也在考虑一些递归函数。

这是到目前为止endGame()函数中的功能:

    private void endGame(){
        this.gameRunning = false;
        List<WAMPlayer> scoreTable = new ArrayList<>(this.players.keySet());
        WAMPlayer winner;
        List<WAMPlayer> tiedPlayers = new ArrayList<>();
        List<WAMPlayer> losers = new ArrayList<>();
        scoreTable.sort(new PlayerScoreComparator());
        for (int i = 0 ; i < scoreTable.size(); i++){
            if (i == scoreTable.size() - 1){
                losers.add(scoreTable.get(i));
                break;
            }

            if (scoreTable.get(i).getScore() == scoreTable.get(i + 1).getScore()){
                for (int j = i + 1; j < scoreTable.size(); j++){

                }
            }
            /*
            Need to set the winner and tied players somewhere here...

             */
        }
    }

这是给定玩家列表的输出示例的两个示例:Player1,Player2,Player3和Player4。玩家按得分排序。

示例一: 玩家1:5,玩家2:4,玩家3:4,玩家4:3

获胜者:Player1 绑定:Player2,Player3 失败者:Player4

示例二: 玩家1:5,玩家2:5,玩家3:5,玩家4:2 获胜者:null 绑定:Player1,Player2,Player3 失败者:Player4

(抱歉播放器4)

2 个答案:

答案 0 :(得分:2)

我们可以使用Collectors#groupingBy和流将每个玩家分为得分组。

import sys
from pympler.asizeof import asizeof

tuple1 = ('1234','2019-04-27','23.4658')
tuple2 = ('1563','2019-04-27','19.2468')
klist1 = [tuple1]
klist2 = [tuple1,tuple2]
# The results for the following did not answer my question 
print ("sys.getsizeof(klist1): ",sys.getsizeof(klist1))
print ("sys.getsizeof(klist2): ",sys.getsizeof(klist2))    
# The results for the following give a quite reasonable answer
print ("asizeof(klist1): ",asizeof(klist1))
print ("asizeof(klist2): ",asizeof(klist2))

每个得分值将具有其自己的键和具有该得分的玩家的列表值。如果是平局,则该键的列表值将包含超过LinkedHashMap<Integer, List<Player>> mappedScores = set.stream().collect( Collectors.groupingBy(Player::getScore, LinkedHashMap::new, //preserve order Collectors.toList())); 个玩家。

然后,我们可以使用简单的for循环枚举地图,并确定哪些球员处于哪个位置以及哪些球员被并列。假设得分越高,排名就越低。

1

答案 1 :(得分:0)

我可能会考虑按得分对玩家进行分组,然后按得分对结果流进行排序。首先是获胜者或并列(基于size())。最后将是失败者(或再次基于size()

看看{@ 3}}的Collectors.grouping
和Stream.sorted()https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.Function-