2014-01-06 255 views
0

我想在Java中創造一種高分。 基本上我想要一個HashMap來保持雙值(所以指數從最高的雙啓動,所以它更容易爲我的高分排序),然後第二個值將是客戶端對象,像這樣:通過hashmap迭代?

private HashMap<Double, TempClient> players = new HashMap<Double, TempClient>(); 

並插入一個新的值:

 TempClient client = new TempClient(kills, rank, deaths, name); 
     this.players.put(client.getKdr(), client); 

現在,我當然不能遍歷散列表,因爲它通過鍵而不是索引獲取列表項。

如何迭代散列表?或者我的情況有什麼好的想法?

我試圖在一個Foo類:

輸出:

0.5 
0.6 
0.9 
0.1 
2.5 

代碼:

public class Foo { 

    public static void main(String[] args) { 
     HashMap<Double, String> map = new LinkedHashMap<Double, String>(); 
     map.put(0.5, "hey"); 
     map.put(0.6, "hey1"); 
     map.put(0.9, "hey2"); 
     map.put(0.1, "hey425"); 
     map.put(2.5, "hey36"); 
     for (Double lol : map.keySet()) { 
      System.out.println(lol); 
     } 
    } 

} 
+0

在這種情況下得分是雙倍嗎?或者一個playerID –

+1

查找Kdr,聽起來好像確實是得分,HashMap工作的方式Double是TempClient的關鍵,如果幾個TempClient具有相同的Kdr,那麼HashMap將只保留一個 –

回答

3

可以遍歷這個樣子。

for (Double k : players.keySet()) 
{ 
    TempClient p = players.get(k); 
    // do work with k and p 
} 

如果你想保留鍵排序,一個TreeMap。
如果您想要按照您在其中插入
的順序保留密鑰,請使用一個LinkedHashMap。

+0

正如peter.petrov所說,循環訪問keySet和每個鍵,從HashMap中獲取值。 –

+0

是的,但是hashmap沒有排序?它輸出雙倍0.1,然後0.3,然後0.9 10 0.6然後0.2? – Artemkller545

+0

NVM:與此相關的Jigar的鏈接hashmap修復了我的想法。 – Artemkller545

0

最好的方法是通過hashmap迭代使用EntrySet。

for (Map.Entry<Double, TempClient> entry : map.entrySet()) { 
    Double key= entry.getKey(); 
    TempClient value= entry.getValue(); 
    // ... 
} 
0

你會更好,讓您的TempClient對象實現可比,將其添加到列表,然後只用Collections.sort()。

0

因爲你不能在HashMap項目進行排序,也可以通過在TreeMap值進行排序,你可以使用一個TreeSet使用自定義類:

class Score implements Comparable<Score> 
{ 
    final Player player; 
    final int score; 

    Score(Player player, int score) { 
    this.player = player; 
    this.score = score; 
    } 

    public int compareTo(Score other) { 
    return Integer.compare(this.score, other.score); 
    } 

    public int hashCode() { return player.hashCode(); } 
    public boolean equals(Object o) { return this.player.equals(...); } 
} 

TreeSet<Score> scores = new TreeSet<Score>(); 
score.add(new Score(player, 500)); 

for (Score s : scores) { 
    .. 
} 

這將有兩個優點:

  • 這將是迭代
  • 它會不斷得分自動排序

它應該與equals,hashCodecompareTo之間的consistente很容易工作,但也許你應該調整一些東西(因爲它是未經測試的代碼)。