8
votes

Structure de données Java pour mapper plusieurs clés de la même valeur

en Java, je cherche un moyen de cartographier plusieurs clés de la même valeur. Disons que j'ai les chiffres 0-9 comme clé et "x", "y" et "z" comme des valeurs suivantes: xxx

maintenant x, y et z sont vraiment longs cordes et j'ai des millions de clés afin que je ne puisse pas me permettre de stocker les cordes plusieurs fois. Comment allez-vous y aller?

Une idée que j'avais était de créer deux tableaux: une seconde à clé artificielle est générée sur laquelle les clés d'origine sont mappées et que dans un autre tableau est la clé des valeurs réelles. De cette façon, les valeurs ne sont stockées qu'une seule fois et que les touches d'origine peuvent toujours être indirectement mappées aux valeurs suivantes: xxx

question: y a-t-il une meilleure structure de données pour cela?


0 commentaires

6 Réponses :


2
votes

Je ne comprends pas vraiment la question. Si vous avez un tableau de chaînes: string [] Art code> Il suffit de définir des indices différents sur le même objet - AKA rendez les références identiques.

String[] map = new String[10];
String x = "foo";
String y = "bar";
String z = "baz";
map[0] = x;
map[1] = y;
map[2] = x;
//...


0 commentaires

20
votes

N'importe quel Carte FAIRE - Vous ne stockez qu'une référence à la chaîne, pas une copie de celui-ci, de sorte que cela n'a pas d'importance.

Si vous construisez la même valeur de chaîne plusieurs fois, utilisez stagiaire () pour obtenir le même objet de chaîne pour la valeur à chaque fois.


2 commentaires

Pete, assez juste. Je n'ai pas vraiment le temps d'écrire un papier à ce sujet, donc je viens de supprimer le commentaire.


Certainement une réponse correcte, mais ne serait-il pas agréable de ne pas avoir à map.put (k, v) pour répéter des valeurs? Ce serait bien de faire quelque chose comme map.put (k1, k2, ..., kn, v) .



2
votes

Pourquoi ne pas inverser la touche / la valeur de la valeur? Utilisez un ensemble ou une matrice pour les valeurs:

x->{3, 4}
y->{0, 1, 2, 5, 7}
z->{6, 8, 9}


0 commentaires

-1
votes

Java consolidera automatiquement les références de chaîne pour vous, de sorte que vous n'avez pas besoin de le faire manuellement afin de sauvegarder la mémoire. Vous pouvez simplement mettre les clés / valeurs dans un hashmap.


1 commentaires

Ce n'est pas vrai. Si c'est un littéral, le compilateur interne les chaînes afin que les littéraux égaux soient remplacés par le même objet String, et vous pouvez appeler manuellement stagiaire () , mais Java ne fera jamais implicitement / automatiquement. à l'exécution. Une fois que vous avez une référence à une chaîne Java ne changera pas cette référence à un autre dans les coulisses, vous pouvez toujours avoir des instances uniques de la même chaîne à l'aide du mot-clé nouveau . Donc, rien de tout cela ne se produit pour les chaînes lues à partir d'un flux d'entrée ou d'une entrée utilisateur, par exemple.



1
votes

Si vous n'aimez pas la suggestion de Pete Kirkham (qui serait la meilleure façon, OMI), vous pouvez utiliser une collections Google (ER ... GUAVA MAINTENNE) multimap .


1 commentaires

J'allais suggérer MULTIMAP également, mais il recherche une mappage de touches de plusieurs clés à la même valeur que le contraire.



0
votes

Chaque entrée de carte utilisera plusieurs centaines de bits pour représenter une valeur théoriquement pourrait être conservée dans 2.

Si les clés sont plus denses que certains nombre de 1 cent plusieurs cents entiers, ce sera plus rapide et plus petit pour ne pas utiliser de carte du tout, mais un tableau - quelque chose comme un Trove TbyteArrayList - où les valeurs d'octets sont mappées sur vos chaînes. Si vous souhaitez obtenir 4 fois plus de densité, Pack 4 valeurs dans un seul octet.

Cela n'a aucun sens à vous soucier du moment où vous avez beaucoup de données - mais vous avez dit des millions de clés, alors je pense que c'est un bon ajustement.


0 commentaires