2011-12-27 38 views
25

Quiero hacer un juego de Java. Al principio, el programa pregunta por el número de jugadores; después de eso, pregunta por sus nombres. Puse sus nombres en un HashMap con una identificación y su puntaje. Al final del juego, cuento el puntaje y quiero ponerlo en el HashMap (el puntaje específico para el nombre específico). ¿Alguien sabe como hacer esto? Este es mi código:¿Cómo puedo iterar sobre los elementos en Hashmap?

jugador:

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; 
} 

principal:

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"); 

     } 

¿Alguien sabe cómo puedo finalmente imprimir, por ejemplo:

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

Actualización:

me hizo esto en principal (como se sugiere Jigar Joshi)

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()); 

} 

e imprime "Puntuación: 0 Nombre: un Puntuación: 4 Nombre: un" cuando pongo dos nombres de los jugadores "a" y "b" .I piensan que el problema está aquí

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

¿Cómo puedo poner los nombres de "names_of_players" de mi anterior for?

Respuesta

49

necesidad clave & Valor en la iteración

Uso entrySet() para recorrer Map y la necesidad de acceder valor y la clave:

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()); 

} 

clave necesaria en la iteración

Si sólo desea para repetir keys del mapa puede usar keySet()

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

Necesidad de valor en la iteración

Si lo que desea es iterar sobre values del mapa se puede utilizar values()

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

} 
+1

+1: o 'entrySet()';) –

+4

+1 entrySet() es razonable si necesita clave y valor. También puede iterar directamente sobre valores (o claves) solamente. – viktor

+0

@viktor nice point. respuesta mejorada –

3

No debe asignar puntuación a jugador. Debe correlacionar jugador (o su nombre) para anotar:

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

A continuación, agregue los jugadores para mapear: puntuación = int .... jugador Jugador = new Player(); player.setName ("John"); // etc. player2score.put (jugador, puntaje);

En este caso, la tarea es trivial:

int score = player2score.get(player);

3

Dado que se numeran todos los jugadores que simplemente sería utilizar un ArrayList<Player>()

Algo así como

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"); 
} 

Usted puede usar este código para imprimir todos los puntajes en su formato.

Cuestiones relacionadas