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>
?
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.
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.
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
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
.
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.
Avec HashMap<String, Integer>
, vous ne pouvez parcourir que keySet()
et faire contains()
pour les touches String
et votre modèle.
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
.
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.
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;
}