2013-01-14 2 views
2

Dans ma demande, nous avons déjàquel type de structure de données est le meilleur?

Map<String, List<String>> 

Maintenant, nous avons eu une autre utilisation cas où la nécessité de trouver une clé qui est mis en correspondance avec une chaîne particulière dans la liste.

Je pense à l'écriture suivante:

string getKey(Map<String, List<String>> m, String str) { 
    for (Entry<String, List<String>> entry :m.entrySet()) { 
    if(entry.getValue().contains(str)) { 
     retrun entry.getKey(); 
    } 
    } 
    return null; 
} 

Map peut avoir à entrées max 2000. et chaque List peut avoir au maximum 500 String s.

Des suggestions qui pourraient être mieux adaptées? Je peux changer la structure de données initiale (Map) aussi s'il y a une meilleure manière de le faire.

+1

Vous pouvez utiliser 'Set ' au lieu de 'List ' car la méthode 'contains()' est beaucoup plus rapide sur 'Set'. Si votre carte est grande, vous pouvez ajouter une autre carte. – Shivam

Répondre

5

Je suggérerais que vous ajoutiez une autre carte qui donne le mappage inverse - d'une chaîne à la liste des clés. Cela nécessitera un peu plus de travail pour rester synchronisé avec la première carte mais donnera les meilleures performances pour votre tâche. Cependant, si vous pensez que la fréquence de ces requêtes sera relativement faible, peut-être que votre solution pourrait être meilleure (bien que plus lente, le temps que vous économiserez pour conserver les deux cartes en synchronisation compensera cela).

+0

nombre de ce type de requêtes peut être d'environ 3000. Si j'ai une autre carte, je vais avoir 1 million d'entrées sur lesquelles je interroge seulement 3000 fois. – vikas368

+1

@ vikas368 oui mais avec la carte, chacune des 3000 requêtes pourrait être linéaire par rapport à la taille de la réponse, tandis que sans cette carte, chaque requête sera linéaire par rapport à ** toutes ** les entrées. Prenez cela en compte et pensez si cela vaut l'optimisation. Je devine 3000, il est probablement préférable d'utiliser la solution que je propose. –

+0

Enfin, je vais avoir une autre carte – vikas368

2

Connaissez-vous l'API Guava? Si vous avez la liberté d'ajouter/modifier des dépendances, il vaut vraiment la peine de vérifier, en particulier les implémentations de l'interface Multimap. C'est exactement construit pour les cas où la même clé peut être mappée à plusieurs valeurs. Dans le cas où j'ai mal compris la question et la même clé ne sera pas mappée à plusieurs valeurs, vous devrez peut-être reformuler/repenser votre question comme votre idée actuelle Map<String, List<String>> est essentiellement juste cela.

+0

J'ai besoin de la chaîne de mappage actuelle -> liste. En plus de cela, nous avons maintenant mentionné le cas d'utilisation. – vikas368

+0

Je suis autorisé à ajouter des dépendances mais je n'ai jamais utilisé l'API Guava. Pouvez-vous me montrer quelques exemples de MultiMap? – vikas368

+0

jetez un oeil à l'exemple dans les pages de doc dans le lien que j'ai donné ci-dessus. Les implémentations 'Multimap' sont sympas dans le sens où vous n'avez pas besoin de gérer les' List's. – posdef

Questions connexes