web-dev-qa-db-fra.com

HashMap <String, Integer> Rechercher une partie d'une clé?

J'utilise actuellement HashMap<String, Integer> qui est rempli de clés de type String qui ont toutes, disons, une longueur de 5 caractères. Comment puis-je rechercher une clé spécifique de 4 caractères ou moins, qui fait partie et se trouve au début de certaines autres clés et obtenir tous les hits sous la forme d'une collection de <Key, Value>?

14
Machtl

Itérer est votre seule option, sauf si vous créez une structure de données personnalisée:

for (Entry<String, Integer> e : map.entrySet()) {
    if (e.getKey().startsWith("xxxx")) {
        //add to my result list
    }
}

Si vous avez besoin de plus de temps, vous aurez besoin d’une implémentation de map dans laquelle vous suivez ces clés partielles.

21
cyborg

Vous ne pouvez pas faire cela via HashMap, vous devez écrire votre propre implémentation pour Map pour implémenter une recherche basée sur la longueur de chaîne dans une carte.

4
harsh

Cela ressemble à un cas d'utilisation de TreeMap plutôt que HashMap. La différence est que TreeMap préserve l’ordre. Vous pouvez donc trouver votre correspondance partielle beaucoup plus rapidement. Vous n'êtes pas obligé de parcourir toute la carte.

Cochez cette question Recherche partielle dans HashMap

4
Ondrej Bozek
Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
    if(key.length() == 4){
        result.put(key, yourMap.get(key);
    }
}

Après avoir exécuté ce code, vous avez toutes les paires clé/valeur avec 4 clés de lettre dans result.

3
André Stannek
Set<Entry<String, Integer>> s1 = map.entrySet();
    for (Entry<String, Integer> entry : s1) {
          if(entry.getKey().length == 4)
          //add it to a map;
}

Commencez par définir l’entrée correspondant à votre hashmap. Parcourez l'ensemble, vérifiez la longueur de chaque clé et ajoutez-la à une carte ou utilisez-la comme vous le souhaitez.

1
Adarsh

Avec HashMap<String, Integer>, vous ne pouvez parcourir que keySet() et faire contains() pour les touches String et votre modèle. 

0
pbespechnyi

Par exemple:

public static void checkMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey().toLowerCase().contains("YourString"))
        }
}

Ce code sera vrai pour les keys qui contiennent votre substring.

0
Asier Aranbarri

Comme il a été noté, il n’existe pas de moyen extrêmement efficace * de le faire avec la structure de données que vous avez spécifiée. Cependant, si vous ajoutez un Map<Integer, List<String>> supplémentaire pour garder la trace du mappage de la longueur de chaîne sur la liste de toutes les clés de cette longueur, vous pourrez le faire très efficacement.

* En utilisant uniquement la carte <String, Integer>, il vous faudrait parcourir la totalité de la capacité de la carte plus grande, tandis que l'ajout de cette structure de données supplémentaire imposerait une recherche O(1) (en supposant que vous utilisiez une HashMap) suivie par itération uniquement dans l'ensemble de résultats, qui est le résultat le plus rapide possible.

0

Vous pouvez essayer cette approche:

public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
    Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
        for (String key : inputMap.keySet()) {
            if(key.length()==5){
                resultHashMap.put(key,inputMap.get(key));
            }   
        }
        return resultHashMap;
    }
0
Shreyos Adikari