Java : Produit Cartésien d'une Liste de Listes
J'ai un problème qui est vraiment le genre de la programmation générale de la question, mais mon application est en Java, donc je vais vous donner de mes exemples de cette façon
J'ai une classe comme ceci:
public class Foo {
LinkedHashMap<String, Vector<String>> dataStructure;
public Foo(LinkedHashMap<String, Vector<String>> dataStructure){
this.dataStructure = dataStructure;
}
public String[][] allUniqueCombinations(){
//this is what I need to do
}
}
J'ai besoin de générer un tableau imbriqué de mon LinkedHashMap
que représente chaque combinaison unique de toutes les valeurs du LHM. par exemple, si mon LHM ressemble à ceci (pseudo-code, mais je pense que vous pouvez obtenir l'idée..):
{"foo" => ["1","2","3"], "bar" => ["3","2"], "baz" => ["5","6","7"]};
puis mon String[][] devrait ressembler à ceci:
{
{"foo","bar","baz"},
{"1","3","5"},
{"1","2","5"},
{"1","3","6"},
{"1","2","6"},
{"1","3","7"},
{"1","2","7"},
{"2","3","5"},
{"2","2","5"},
{"2","3","6"},
{"2","2","6"},
{"2","3","7"},
{"2","2","7"},
{"3","3","5"},
{"3","2","5"},
{"3","3","6"},
{"3","2","6"},
{"3","3","7"},
{"3","2","7"},
}
Je pense que c'est tout, je l'ai fait manuellement (évidemment) donc j'ai peut-être raté un jeu, mais je pense que cela illustre ce que je suis en train de faire. Il n'a pas d'importance quel ordre chaque ensemble est livré dans, aussi longtemps que toutes les combinaisons uniques sont présents. Aussi pour être clair, vous ne savez pas combien d'éléments sont dans le LHM, ni la façon dont de nombreux éléments sont à chaque Vecteur. J'ai trouvé des réponses qui correspondent le cas où vous voulez que chaque combinaison unique de tous les éléments dans un seul tableau, mais rien qui correspond à ce exactement. Si c'est une copie exacte d'une question cependant, veuillez mettre un lien dans la réponse et je vais fermer la question.
mise à jour - j'ai changé les types de chaînes car mon l'exemple du monde réel est en fait des chaînes de caractères. J'ai essayé d'utiliser des entiers pour rendre l'exemple plus lisible, mais les réponses que j'ai obtenu jusqu'à présent ne se traduisent pas bien pour les cordes. Donc, oui ils sont en nombres, mais dans mon cas, ils devront être des chaînes de caractères qui ne serait pas beaucoup de sens pour personne, mais les gens qui utilisent cette application particulière. donc, ce n'est qu'une abstraction.
Vector
? stackoverflow.com/questions/1386275/...Pourquoi tous les uniqueCombinations de longueur 3? Quelle est la signification de l'entrée [3,2] dans l'entrée?
c'est un Vecteur parce que c'est un Vecteur. Je n'ai pas une bonne explication pour vous. Je ne suis pas vraiment un grand fan de typage statique.
les combinaisons uniques ont une longueur de trois à cause de discbased.size() == 3 dans ce scénario. si il y avait des 4 éléments dans le haut niveau de discbased, puis chacune d'elles serait de 4..
Quelle est la signification de la
Integer
clé dans le LHM? Si la commande pour la combinaison des tableaux sont basés sur l'ordre des clés, ou la commande du LHM? (c'est à dire si j'ai ajouté des touches de 3,2,1 dans cet ordre pour le LHM, dois-je utiliser la même commande ou 1,2,3) Supposons que j'ai mappages de touches 1,2,4,6...si la combinaison de la matrice de sauter 3 et 5 ou utiliser une valeur spéciale? (par exemple, 0, -1, etc.)OriginalL'auteur Chris Drappier | 2012-03-06
Vous devez vous connecter pour publier un commentaire.
Essayer quelque chose comme cela:
qui permet d'imprimer:
J'ai implémenté l'algorithme ci-dessus sur la base (je crois) un de Knuth est TAOCP livres (dans les commentaires @chikitin a une référence plus précise: c'est dans PRÉ FASCICULE 2A de la section 7.2.1.1 de Générer Tous les n-tuple, de L'Art De la Programmation Informatique par Knuth, Addison Wesley).
Notez que j'ai nommé les tableaux
set
, mais ils n'ont pas besoin de détenir des éléments uniques, bien sûr. Le temps que je l'ai utilisé, ils contenaient des éléments uniques, d'où le nom.MODIFIER
C'est à peu près d'un 1-sur-1 traduction:
Si vous exécutez la classe ci-dessus, le texte suivant est imprimé:
cela ne se traduit pas trop bien à mon cas d'utilisation, j'ai mis à jour la question, si vous voulez prendre un autre coup, je l'apprécierais. merci!
eh bien, parce que la valeur de la partie de la LHM est un Vector<String>, je ne peux pas dire que les solutions *= définit[i].longueur. aussi, je ne peux pas appeler discbased.obtenir(j'.toString()) ou quelque chose comme ça parce que les clés seront "foo","bar", "baz", etc..
Comment peut-on expliquer le
set[(i/j)%set.length
partie de la boucle intérieure et la suitej *= vec.size();
? Ou est-ce un truc à savoir?Merci pour la solution. C'est dans PRÉ FASCICULE 2A de la section 7.2.1.1 de Générer Tous les n-tuple, du livre The art of computer programming par Knuth, Addison Wesley.
OriginalL'auteur Bart Kiers
Je sais que c'est longtemps après que vous avez besoin d'une réponse, mais de toute façon je peut pas s'abstenir de remarquer que l'on pourrait passer à Groovy, au moins pour une partie d'une application Java, et écrire une classe wrapper pour correspondre à l'interface souhaitée. Le Groovy code de ces permutations est
Depuis que j'ai commencé à utiliser Groovy dans mes applications Java, il est plus rapide de les écrire et de manière plus intéressante, debug/profil (ehem...)
OriginalL'auteur Bulba
Comment sur la génération de produit paresseusement, c'est à dire. seulement de créer le tuple lorsque vous avez accédé?
et de l'utiliser comme ceci
Le résultat:
Comme un bonus supplémentaire, vous pouvez l'utiliser à rejoindre les chaînes de tous avec tous:
Le résultat:
OriginalL'auteur Adrian Panasiuk
Prendre un coup d'oeil à l'une des deux méthodes suivantes, ils font exactement ce que vous avez demandé. Je leur ai écrit pour être générique, il n'a pas d'importance combien de temps vos listes sont ou combien il existe des clés de la carte, les combinaisons générées sont corrects.
Le code ci-dessous est itératif, basé sur l'algorithme de Python
itertools.produit()
fonction pour calculer le produit Cartésien d'une liste de listes.Je les ai testés avec l'exemple de la question:
La réponse qui est imprimé est prévu (bien que les combinaisons apparaissent dans un ordre différent):
OriginalL'auteur Óscar López
Vous pouvez également résoudre ce vraiment facilement avec Fonctionnel Java Liste monade:
OriginalL'auteur Shlomi
La goyave est un utilitaire méthode qui retourne un produit cartésien d'une liste de jeux: Les ensembles.cartesianProduct.
OriginalL'auteur Vitalii Fedorenko
Ici est un lien, ses c#, mais je suis sûr que vous pourriez travailler avec!
OriginalL'auteur Shlomi
Une LinkedHashMap de Vecteurs de Chaînes est ... - gênant. J'ai dû passer beaucoup de temps dans la conversion d'une solution pour l'utiliser, mais à la fin, je n'ai pas de produire une ArrayOfArrays, mais une Liste de Liste et de garder la dernière étape pour le lecteur.
Bien oui, et je analyser des données de test.
L'idée principale est que vous avez certaines Listes (abc, 12, defg, ...) et vous avez 3 possibilités au pos 0, 2 au pos 1, 4 au pos 3 et ainsi de suite, donc 3*2*4 les combinaisons jusqu'à présent.
À partir de chiffres de 0 à 23, vous pouvez choisir à partir de chaque sous-liste avec modulo, et de la main le reste de la nombre divisé par la taille de la liste précédente et le reste des listes de manière récursive à la procédure, jusqu'à ce qu'il n'y a pas de liste de gauche.
OriginalL'auteur user unknown
Je suis en retard à la fête, mais j'ai suivi Shiomi du lien et de traduire les fonctions en Java. Le résultat est un facile de suivre et de comprendre l'algorithme (j'ai peut-être un peu lent depuis que j'ai eu du mal à comprendre Bart Kiers solution).
Ici, c'est (la clé est un int, en remplacement de Chaîne doit être simple):
Utilisation
Résultat
Produit Cartésien Des Fonctions
OriginalL'auteur Ulises
Vous pouvez générer les combinaisons de manière récursive.
De sortie :
OriginalL'auteur sujithvm