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: 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? P> 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: p> question: y a-t-il une meilleure structure de données pour cela? p> p>
6 Réponses :
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;
//...
N'importe quel Si vous construisez la même valeur de chaîne plusieurs fois, utilisez Carte stagiaire () code> pour obtenir le même objet de chaîne pour la valeur à chaque fois. P>
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) code> pour répéter des valeurs? Ce serait bien de faire quelque chose comme map.put (k1, k2, ..., kn, v) code>.
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}
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. P>
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 () code>, 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 code>. 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.
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 code> . P>
J'allais suggérer MULTIMAP également, mais il recherche une mappage de touches de plusieurs clés à la même valeur que le contraire.
Chaque entrée de carte utilisera plusieurs centaines de bits pour représenter une valeur théoriquement pourrait être conservée dans 2. P>
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. P>
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. P>