Produit cartésien de l'arbitraire des jeux en Java
Savez-vous bien Java libaries qui vous permettent de faire le produit cartésien de deux (ou plus) de jeux?
Par exemple: j'ai trois sets. L'un des objets de la classe Personne, deuxième avec les objets de la classe Don et le troisième avec les objets de la classe GiftExtension.
Je souhaite générer un ensemble contenant tous les possibles triples Personne-Don-GiftExtension.
Le nombre de jeux peuvent varier donc je ne peux pas le faire en boucle foreach imbriquée.
Sous certaines conditions, mon application doit prendre un produit de Personne-Don paire, parfois, c'est le triple de Personne-Don-GiftExtension, parfois il y a même des jeux de Personne-Don-GiftExtension-GiftSecondExtension-GiftThirdExtension, etc.
Cette question est très intéressante d'un theoreticel, point de vue académique. J'ai été surpris de voir combien il est difficile de trouver une solution propre pour une simple question comme celle - ci, si j'en avais trouvé un, j'aurais répondu. Mais il faut l'avoir dit...
...votre Question semble cibler une application spécifique, et il me semble que si vous allez perdre tous les typesafty si vous venez de punch tout en jeux et jeux dans un produit cartésien. Peut-être que votre approche est gravement erronée, par la pensée, aux mathématiques et à quelques en termes de programmation orientée objet?
On dirait que vous voulez un tuple relationnel de calcul, pas de Java 😉
Voir ma réponse à la même question quand il a été republié ici: stackoverflow.com/questions/1719594/...
OriginalL'auteur mgamer | 2009-04-03
Vous devez vous connecter pour publier un commentaire.
Edit: solutions Précédentes pour les deux ensembles supprimé. Voir l'historique des modifications pour plus de détails.
Ici est une façon de le faire de manière récursive pour un nombre arbitraire de jeux:
Noter qu'il est impossible de garder un type générique de l'information avec les ensembles renvoyés. Si vous saviez à l'avance le nombre de jeux que vous souhaitiez prendre le produit, vous pouvez définir un tuple générique de tenir que de nombreux éléments (par exemple
Triple<A, B, C>
), mais il n'existe aucun moyen d'avoir un nombre arbitraire de paramètres génériques en Java.OriginalL'auteur Michael Myers
C'est une jolie vieille question, mais pourquoi ne pas utiliser La goyave est cartesianProduct?
Lien de la pourriture qui s'est passé.
Actuellement, c'est une solution plus facile 😉
OriginalL'auteur Martin Andersson
La méthode ci-dessous crée le produit cartésien d'une liste de liste de chaînes de caractères:
Exemple:
donnerait ceci:
OriginalL'auteur Philipp Meister
Deux conseils:
OriginalL'auteur Michael Borgwardt
Indice solution basée sur
De travail avec les indices sont une alternative rapide et efficace de la mémoire et peut gérer n'importe quel nombre de jeux. La mise en œuvre de Itératif permet de faciliter l'utilisation dans une boucle for-each. Voir le #méthode principale pour un exemple d'utilisation.
OriginalL'auteur Remko Popma
Ici est un objet iterable, qui vous permet d'utiliser une procédure simplifiée pour la boucle:
Comment est-il fait? Nous avons besoin d'un objet iterable, à l'utilisation de la simplification de la boucle for, et un Itérateur doit être retournée par l'objet iterable.
Nous retourner une Liste des Objets - ce pourrait être un Jeu au lieu de la Liste, mais n'a aucun accès indexé, donc il serait un peu plus compliqué à mettre en œuvre avec de Jeu au lieu de la Liste. Au lieu d'une solution générique, l'Objet aurait été bien pour de nombreuses raisons, mais les génériques de permettre à davantage de restrictions.
Le travail mathématique est fait dans le 'get'-méthode. Pensez-2 séries de 10 éléments. Vous avez un total de 100 combinaisons, énumérés dans 00, 01, 02, ... 10, ... à 99. Pour 5 X 10 éléments 50, pour 2 X 3 éléments 6 combinaisons. Le modulo de la sous-liste de la taille permet de choisir un élément à chaque itération.
Itérable j'ai le moins de chose intéressante ici:
À mettre en œuvre Itératif, ce qui permet pour chaque type de boucle, nous avons à mettre en œuvre iterator (), et pour Itérateur nous avons à mettre en œuvre hasNext (), next () et remove ().
Résultat:
OriginalL'auteur user unknown
Voici un
Iterator
que donne le produit cartésien d'un tableau à deux dimensions, où les matrices de composants représentent les ensembles à partir de la question (on peut toujours convertir leSet
s pour les tableaux):L'idée de base est de traiter
count
comme un multi-radix nombre (chiffrei
dispose de sa propre base, qui est égale à la longueur de lai
'th "set"). Chaque fois que nous avons à résoudrenext
(qui est, quandhasNext()
est appelé etnext
estnull
), on décompose le nombre en ses chiffres dans ce multi-radix. Ces chiffres sont maintenant utilisées comme des indices à partir de laquelle on tire des éléments de plusieurs ensembles.Exemple d'utilisation:
De sortie:
Si on n'aime pas les tableaux, le code est trivialement convertibles en actions à l'aide de collections.
Je suppose que c'est plus ou moins similaire à la réponse donnée par "utilisateur inconnu", seul, sans récursivité et de collections.
OriginalL'auteur Halle Knast
Oui, il y a Fonctionnel Java.
Pour une série (s):
s.bind(P. p2(), s);
OriginalL'auteur
La mémoire (et de traitement) de l'empreinte nécessaire pour un produit Cartésien peut sortir de la main assez rapidement. L'implémentation naïve peut d'échappement de la mémoire et de prendre beaucoup de temps. Il serait agréable de connaître les activités que vous envisagez de jouer dans un tel ensemble, afin de proposer une stratégie de mise en œuvre.
Dans tous les cas, faire quelque chose comme Jeux de.SetView sur google collections. C'est un jeu qui obtient adossés à d'autres séries comme ils ajouté. L'idée de leur problème, c'est pour éviter le addAll appel. L'idée de votre problème est d'éviter de faire NxMxK ajoute à un ensemble.
Google collections peuvent être trouvés ici et la catégorie est ici
OriginalL'auteur H Marcelo Morales