2010-03-01 6 views
0

J'ai une hashmap déclarée comme private HashMap testMessages = null;Iterate Hash Map

Je vais stocker des valeurs de chaîne à la fois dans la partie clé et valeur de la table hashmap extraite de la table oracle.

Je ne suis pas concerné par les clés hashmap. Je veux récupérer les valeurs hashmap seules et vérifier si le nom de la variable de chaîne est préfixé avec l'une des valeurs de mappage de hachage et renvoyer true si c'est la même chose. Je veux m'assurer que les valeurs de la carte de hachage ne sont pas nulles et vides.

fonction

(string filename) {..

boucle

à travers les valeurs hashmap

vérifier si le nom de fichier variable est préfixé avec l'une des valeurs de HashMap si oui return true sinon return false }

exemple hashmap: key1, prod key2, essai key3, mannequin
exemple de nom de fichier: test123_20012010.csv

doit retourner vrai que le nom du fichier est préfixé avec l'une des valeurs hashmap

Comment puis-je le faire?

Répondre

2

Voici une approche en force brute pour parcourir les valeurs de la carte de hachage et vérifier si le nom de fichier commence par la valeur.

// generics version 
private HashMap<String, String> testMessages = buildMap(); 

for (String v : testMessages.values()) { 
    if (filename.startsWith(v) { 
    // found a map value that starts the file name 
    } 
} 

// alternative non-generics version 
private HashMap testMessages; // assigned somewhere 

for (Object v : testMessages.values()) { 
    if (filename.startsWith((String) v) { 
    // found a map value that starts the file name 
    } 
} 
+0

Je ne veux pas utiliser buildmap Je reçois des erreurs de compilation TestHash.java:20: types incompatibles trouvés: java.lang.Object requis: java.lang.String pour (String prefix: hMap.values()) {Remarque: TestHash.java utilise des opérations non contrôlées ou non sécurisées. Remarque: recompiler avec -Xlint: non cochée pour plus de détails. 1 erreur – Arav

+0

Remplacez buildMap() par la méthode que vous utilisez pour construire le testMessages HashMap. Mon exemple utilise des génériques afin que vous n'ayez pas à convertir les instances d'objet que vous sortez de HashMap en String. – marklai

+0

mise à jour de réponse avec l'exemple non-génériques – marklai

0

sangsues de leepoint.net

public static void iterate_over_hashmap(Map mp) { 
    Iterator it = mp.entrySet().iterator(); 
    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry)it.next(); 
     System.out.println(pairs.getKey() + " = " + pairs.getValue()); 
    } 
} 

Vous devez traiter chaque entrée comme une paire clé/valeur et itérer sur ceux comme une seule entité. Ensuite, vous lancez dans Map.Entry et vous pouvez lire à la fois séparément

+0

Il est un HashMap privé hashmap puis-je passer à une carte? private HashMap testMessages = null; Puis-je appeler iterate_over_hash (testMessage)? Aussi comment peut vérifier si le nom du fichier de variable est préfixé avec l'une des valeurs hashmap si donc retourner vrai sinon retourner false – Arav

+0

Il a dit qu'il ne se soucie pas des clés. – polygenelubricants

5
for (String prefix : map.values()) { 
    if (filename.startsWith(prefix)) { 
     return true; 
    } 
} 
return false; 

Il convient de noter que ce temps linéaire du nombre d'entrées dans la carte dans le pire des cas. Si vous avez plusieurs filename que vous voulez vérifier, il vaut mieux prétraiter les préfixes et construire quelque chose comme une patrie et d'autres structures de données ressemblant à des dictionnaires rapides.

+0

Je reçois des erreurs de compilation TestHash.java:20: types incompatibles trouvé: java.lang.Object nécessaire: java.lang.String pour (String prefix: hMap.values ​​()) { Remarque: TestHash.java utilise des opérations non contrôlées ou non sécurisées. Remarque: recompiler avec -Xlint: non cochée pour plus de détails. 1 erreur – Arav

+0

Comment avez-vous déclaré 'hMap'? Est-ce juste 'HashMap hMap'?Quel est le type des clés? Quelque chose comme 'HashMap hMap' fonctionnerait-il? – polygenelubricants

+0

HashMap hMap = null; hMap = new HashMap (); hMap.put ("1", "One"); hMap.put ("2", "Deux"); hMap.put ("3", "Three"); javac TestHash.java TestHash.java:26: types incompatibles trouvé: java.lang.Object requis: java.lang.String pour (String prefix: hMap.values ​​()) { ^ 1 erreur – Arav

0
function(String fileName) 
{ 
    for(String value : hashMap.values()) 
    { 
     if(fileName.startsWith(value)) 
      return true; 
    } 
    return false; 
} 
+0

@polygenelubricants je devrais prendre plus de temps pour lire attentivement la question. –

+0

Merci beaucoup pour l'info – Arav