2011-09-27 3 views
2

J'ai créé un multi-hachage du type suivant: clé sous la forme d'une paire de chaînes, d'une chaîne et d'une valeur aussi longue. J'ai inséré quelques valeurs dans la table en utilisant la fonction put.Filtrage des clés Guava HashMultimap par le nombre

HashMultimap<Pair<String, String>, Long> hm = HashMultimap.create(); 

Maintenant, je veux trouver toutes les clés qui ont plusieurs valeurs. Je veux utiliser pour boucle pour itérer sur toutes les clés et trouver les clés qui ont plusieurs valeurs. S'il vous plaît aidez-moi comment puis-je faire cela?

Répondre

2
Set<Pair<String, String>> keysWithMultipleValues = Sets.newHashSet(); 

for (Pair<String, String> key : hm.keySet()) 
{ 
    if (hm.get(key).size() > 1) 
    { 
     keysWithMultipleValues.add(key); 
    } 
} 
+1

+1, mais je pense que vous voulez '&& values.size()> 1'. Aussi la spécification dit que vous n'avez pas besoin de vérifier null; S'il n'y a pas de mappage, une collection vide sera renvoyée. –

+0

@Mark vous avez raison - déjà corrigé. Notez également que 'Multimap # get()' ne retourne jamais 'null' –

4

Matt est couvert de manière procédurale. L'approche plus fonctionnelle (encore bavard depuis Java n'a pas encore bouclages) serait quelque chose comme ceci:

public class MoreThanOnePredicate<T extends Map.Entry<?, ? extends Collection<?>>> implements Predicate<T> { 
    public boolean apply(T entry) { 
     return entry.getValue().size() > 1; 
    } 
} 

//... 
return Maps.filterEntries(hm.asMap(), new MoreThanOnePredicate<Pair<String, String>, Collection<Long>>()).keySet(); 

Je n'ai pas la bibliothèque et un compilateur devant moi, donc il y a probablement des médicaments génériques non résolus problèmes avec ça.

2

Cela devrait être un peu plus efficace que la version de Matt comme aucune recherche par des touches est utilisée:

Set<Pair<String, String>> r = Sets.newHashSet(); 
for(Entry<Pair<String, String>> e : create.keys().entrySet()) { 
    if(e.getCount() > 1) r.add(e.getElement()); 
} 
Questions connexes