1

我正在开发一个 Android 应用程序,该应用程序需要根据一轮高尔夫的分数来确定当前的发球台顺序。对于那些不知道的人,发球顺序(或荣誉)是根据上一洞(当前第 1 洞)得分最高(最低)的球员从发球台击球的顺序。如果有平局,那么我需要查看当前的hole-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 个洞,那么我需要考虑未打过的洞。如果这还不是很明显...

4

2 回答 2

1

第一个想法是使用Comparator。假设你有一个 Players 集合并且每个玩家都有它的分数,你可以实现类似的东西:

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);
于 2012-06-18T14:03:18.740 回答
1

你只需要一个循环。

循环遍历孔号(从它们的起始孔开始,必要时返回 1)。

在每个洞,查看球员在该洞的得分,然后更新当前谁获得荣誉的状态。

于 2012-06-18T14:11:41.893 回答