2012-06-18 37 views
1

我正在研究一種Android應用程序,需要根據一輪高爾夫中的分數來確定當前的T恤訂單。對於那些不知道的球員來說,發球順序(或榮譽)是球員從發球位置擊球的順序,根據誰是前一洞(當前洞1)的得分最高(最低)的球員。如果有關係,那麼我需要看看當前的洞2 ......等等。直到我找到了訂單,或者檢查了所有分數,我將使用他們開始的訂單。一旦我找出了一個玩家的訂單,我會停止檢查該玩家的分數。問題在於玩家可以從任何洞開始。也可以有任何數量的孔。因此,如果他們從洞3開始,那麼他們將在洞2上結束。因此他們將進入洞18(假設18洞球場),然後環繞並從洞1開始。如果您需要更好的解釋,請告訴我我會嘗試。確定高爾夫球T恤訂單功能Java

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

如果他們從洞3開始,他們爲什麼會在洞1上結束?他們不會在第二洞結束嗎? – brimborium

+0

@brimborium哎呀,謝謝!固定。 –

回答

1

你只需要一個循環。

循環穿過孔編號(從其開始孔開始並在必要時回捲到1)。

在每個洞,查找球員的洞的分數,然後更新誰有榮譽的當前狀態。

+0

我可以看到你的意思。我最初是從第一個完成的洞開始的,後來嘗試使它更加高效。但是我並沒有想象要在比賽中順利完成比賽並改變順序,直到我達到最終目標或達到一個未打出的球洞。我也會試試這個。 –

+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); 
+0

好吧,我可以看到,這將是一個很好的有組織的方式去,以便我可以實現我的自定義排序方法。我之前沒有使用Comparator類,看起來不錯。讓我試試看...... –