我正在开发一款Android应用程序,需要根据一轮高尔夫中的分数确定当前的T恤顺序。对于那些不知道的人,发球顺序(或荣誉)是指球员根据前一洞(当前球洞1)中得分最高(最低)的球员从球座击球的顺序。如果有关系,那么我需要看看当前的洞2等等。直到我弄清楚了订单,或检查了所有分数,我会使用他们开始的订单。一旦我找到一个玩家的订单,我会停止检查该玩家的分数。问题在于球员可以从任何球洞开始。也可以有任意数量的孔。因此,如果他们从第3洞开始,那么他们将在第2洞结束。所以他们将进入第18洞(假设有18洞球场)然后环绕并从第1洞开始。如果您需要更好的解释,请告诉我我会试试。
Example data:
Holes: 9
Starting hole: 3
Player 1: 0,0,5,4,5,6,3,2,5
Player 2: 0,0,4,2,5,3,3,6,3
Player 3: 0,0,4,3,7,3,2,2,5
Assume the starting order is: Player 1, Player 2, Player 3
Example Output of the order after calculation:
Player 2, Player 3, Player 1
我已经攻击过这个问题,认为它很容易但事实证明它比我想象的更难。我已经走过了迭代路线,首先循环遍历每个玩家,然后循环每个玩家的得分,他们都得到了第一洞...等等但是我发现我有很多for循环而且它只是用大量的if语句变得丑陋。我打算尝试一种递归解决方案,但我想知道是否有人有任何想法,而我稍稍休息一下。如果有人想看我的代码,我目前正在工作并在PHP中测试它,因为我的开发服务器上没有Java,因此代码将使用PHP。但是移植到Java很容易。感谢您的帮助!
编辑:我还应该注意,我会随时知道这些信息,无论他们是否完成了这一轮。因此,如果他们从第3洞开始并且只打了2个洞,那么我需要考虑未打的洞。如果那不是很明显......
答案 0 :(得分:1)
第一个想法是使用Comparator。假设你有一个玩家集合,每个玩家都有得分,你可以实现类似的东西:
public Comparator<Player> PlayerComparator = new Comparator<Player>(){
@Override
public int compare(Player p1, Player p2) {
int order = 0;
//Compare the score of the players starting from the starting hole
while(...){
...
}
return order;
}
};
然后,执行:
Collection.sort(playerList, PlayerComparator);
答案 1 :(得分:1)
你只需要一个循环。
循环穿过洞号(从他们的起始洞开始,如有必要,回到1)。
在每个洞中,查看球员对该洞的得分,然后更新目前谁拥有荣誉的状态。