2011-12-27 78 views
25

我想製作一個Java遊戲。起初該程序要求玩家人數;之後,它要求提供他們的名字。我把他們的名字放在HashMap的ID和他們的分數上。在比賽結束時,我計算得分,我想把它放在HashMap(具體名稱的具體分數)。有誰知道如何做到這一點?這是我的代碼:如何迭代Hashmap中的元素?

球員:

public class Player { 

public Player() { 
} 

public void setScore(int score) { 
    this.score = score; 
} 

public void setName(String name) { 
    this.name = name; 
} 

private String name; 
private int score; 

public Player(String name, int score) { 
    this.name = name; 
    this.score = score; 
} 
public String getName() { 
    return name; 
} 

@Override 
public String toString() { 
    return "Player{" + "name=" + name + "score=" + score + '}'; 
} 

public int getScore() { 
    return score; 
} 

主:

Scanner scanner = new Scanner(System.in); 
HashMap<Integer,Player> name= new HashMap<Integer,Player>(); 

    System.out.printf("Give the number of the players "); 
    int number_of_players = scanner.nextInt(); 


    for(int k=1;k<=number_of_players;k++) 
    { 


     System.out.printf("Give the name of player %d: ",k); 
     name_of_players= scanner.nextLine(); 
     name.put(k, new Player(name_of_players,0));//k=id and 0=score 

    } 


    //This for finally returns the score and   
    for(int k=1;k<=number_of_players;k++) 
    { 
     Player name1 = name.get(k); 
    System.out.print("Name of player in this round:"+name1.getName()); 
    .............. 
    ............. 
    int score=p.getScore(); 
    name.put(k,new Player(name1.getName(),scr));//I think here is the problem 

    for(int n=1;n<=number_of_players;n++)//prints all the players with their score 
     { 

    System.out.print("The player"+name1.getName()+" has "+name1.getScore()+"points"); 

     } 

有誰知道我怎樣才能最後打印例如:

"The player Nick has 10 points. 
The player Mary has 0 points." 

更新:

我這樣做是在main(如Jigar喬希建議)

name.put(k,new Player(name1.getName(),scr)); 
Set<Map.Entry<Integer, Player>> set = name.entrySet(); 

for (Map.Entry<Integer, Player> me : set) 
{ 
System.out.println("Score :"+me.getValue().getScore() +" Name:"+me.getValue().getName()); 

} 

,並打印「得分:0名稱:一個分數:4名:一個」當我把球員兩個名字「A」和「b」。我認爲這個問題是在這裏

name.put(k,new Player(name1.getName(),scr)); 

我怎樣才能把名字在我以前for的「names_of_players」?

回答

49

需要迭代重點&價值

使用entrySet()通過Map迭代和需要訪問值和鍵:

Map<String, Person> hm = new HashMap<String, Person>(); 

hm.put("A", new Person("p1")); 
hm.put("B", new Person("p2")); 
hm.put("C", new Person("p3")); 
hm.put("D", new Person("p4")); 
hm.put("E", new Person("p5")); 

Set<Map.Entry<String, Person>> set = hm.entrySet(); 

for (Map.Entry<String, Person> me : set) { 
    System.out.println("Key :"+me.getKey() +" Name : "+ me.getValue().getName()+"Age :"+me.getValue().getAge()); 

} 

需要鍵入迭代

如果你只想遍歷您可以使用地圖的keyskeySet()

for(String key: map.keySet()) { 
    Person value = map.get(key); 
} 

需要價值迭代

如果你只是想遍歷地圖values可以使用values()

for(Person person: map.values()) { 

} 
+1

+1:或entrySet();; – 2011-12-27 11:35:50

+4

如果你需要key和value兩個參數,entrySet()是合理的。你也可以直接遍歷值(或鍵)。 – viktor 2011-12-27 11:39:07

+0

@viktor好點。增強的答案 – 2011-12-27 11:44:11

3

你不應該得分映射到播放器。您應該映射播放器(或他的名字)得分:

Map<Player, Integer> player2score = new HashMap<Player, Integer>();

然後加入玩家地圖: INT得分= .... Player播放器=新播放器(); player.setName(「John」); //等 player2score。把(球員,得分);

在這種情況下,任務很簡單:

int score = player2score.get(player);

3

因爲所有的球員屈指可數我只想用一個ArrayList<Player>()

喜歡的東西

List<Player> players = new ArrayList<Player>(); 

System.out.printf("Give the number of the players "); 
int number_of_players = scanner.nextInt(); 
scanner.nextLine(); // discard the rest of the line. 

for(int k = 0;k < number_of_players; k++){ 
    System.out.printf("Give the name of player %d: ", k + 1); 
    String name_of_player = scanner.nextLine(); 
    players.add(new Player(name_of_player,0)); //k=id and 0=score 
} 

for(Player player: players) { 
    System.out.println("Name of player in this round:" + player.getName()); 
1
HashMap<Integer,Player> hash = new HashMap<Integer,Player>(); 
Set keys = hash.keySet(); 
Iterator itr = keys.iterator(); 

while(itr.hasNext()){ 
    Integer key = itr.next(); 
    Player objPlayer = (Player) hash.get(key); 
    System.out.println("The player "+objPlayer.getName()+" has "+objPlayer.getScore()+" points"); 
} 

你可以使用此代碼以您的格式打印所有分數。