2017-07-24 4 views
4

Ce que j'essaie de comprendre est de savoir comment vérifier si un hashmap (qui dans mon cas pourrait avoir un certain nombre de clés) a seulement un d'un certain valeur qui lui est attribuée. J'ai du mal à expliquer ça ici.Comment vérifier le nombre de clés ont une certaine valeur dans un hashmap

Si j'ai un hashmap avec 10 clés (chacun est un joueur dans un jeu assigné pour avoir un gamestate en fonction de quel "gamestate" il se trouve) et il n'y a qu'un joueur avec l'état de jeu IN_GAME. Alors, comment puis-je vérifier qu'il n'y a en fait qu'une seule clé affectée avec la valeur IN_GAME, et il n'y a pas deux clés avec cette valeur?

J'espère que cela a du sens.

+0

Avez-vous considéré comme un [ 'Goyave BiMap'] (https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/BiMap.html)? –

+0

@JoeC Je suis encore un peu nonchalant alors je vais regarder ça. Merci. – joeldesante

+0

Une façon d'éviter le problème est d'avoir une variable appelée 'playerInGame'. Ensuite, il ne peut contenir qu'un seul joueur (ou zéro avec 'null'). –

Répondre

3

Utilise des flux pour que:

Map<String, String> data = new HashMap<>(); 
// adding data 
long count = data.values().stream().filter(v -> v.equals("IN_GAME")).count(); 

Count retourne le nombre de valeurs "IN_GAME" dans votre carte.

+0

Je le fais déjà. Mais comment puis-je vérifier si un seul joueur a cette valeur assignée? – joeldesante

+0

@Chai T. Rex, tnx pour le commentaire. J'ai modifié ma réponse –

+0

Ou 'filter (" IN_GAME ":: equals)', ou 'Predicate.isEqual (" IN_GAME ")' – shmosel

0

L'utilisation d'une instance d'Iterator semble résoudre le problème.

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 

public class Stack{ 

public static void main(String[] args){ 
    //create a hashmap 
    HashMap<Integer, String> map = new HashMap<Integer,String>(); 

    //populate with dummy out-game entries 
    for(int i = 0; i < 8;i++){ 
     map.put(i, "OUT-GAME"); 
    } 

    // add the last two with in-game value 
    map.put(8, "IN-GAME"); 
    map.put(9, "IN-GAME"); 

    //declare an iterator on map 
    Iterator it = map.entrySet().iterator(); 

    //number of time "in-game" is encountered 
    int check = 0; 

    //while the iterator has more to go 
    while(it.hasNext()){ 

     //get the key-value pairs and print them just for checking 
     //the entries 

     Map.Entry pair = (Map.Entry<Integer,String>) it.next(); 
     System.out.println(pair.getKey() + " " + pair.getValue()); 

     //if the value "in-game" is encountered increment the check by 1 

     if(pair.getValue().equals("IN-GAME")){ 
      System.out.println("We have a player in game"); 
      check++; 
     } 

     //if "in-game" is encountered more than once, then print an alarm 

     if(check > 1){ 
      System.out.println("More than 1 player in game. There's something wrong"); 
     } 
    } 

    //if there's only one player with "in-game", inform me 

    if(check == 1){ 
     System.out.println("We have exactly one player in the game"); 
    } 
} 
} 

Le code ci-dessus vous informe, il y a plus d'un joueur avec la propriété "in-game" sur.

0

Si vous voulez vérifier s'il y a des valeurs doublons, la solution la plus simple est de vider dans un ensemble et comparer la taille du résultat à l'original:

boolean hasDuplicates = new HashSet<>(map.values()).size() < map.size();