8
votes

Obtenir toute permutation possible d'une chaîne ou d'une combinaison, y compris des caractères répétés dans Java

J'ai essayé de générer une liste de toutes les chaînes de caractères possibles pouvant être constituées de tout jeu de caractères donné. J'ai utilisé une fonction pour générer toutes les 4 caractères à partir d'un ensemble de caractères, mais chaque caractère n'est jamais utilisé qu'une seule fois. J'ai besoin de toutes les combinaisons possibles à l'aide d'un ensemble donné de caractères par exemple: xxx pré>

à l'aide de la classe de Générateur de ici , Cela retournera toutes les combinaisons de caractères uniques telles que: P> xxx pré>

mais, je veux chaque chaîne possible pouvant être créée à l'aide des caractères donnés. Par exemple: P>

'aaaa', 'aaab', 'abc1', 'aac1', '11c2'


0 commentaires

5 Réponses :


0
votes

Vous pouvez traiter vos éléments sous forme de chiffres. Pensez à la façon dont nous obtenons chaque combinaison possible de "0" - "9" en comptant. Commencez par 0000, 0001, 0002, ..., 0010, 0011, etc. Utilisez le même processus, comme si vous disposiez d'un système de numéro de base-6 (ou de base-n, où N est la longueur de vos éléments code> tableau.

string comb;
for (int i = 0; i < elements.length; i++)
    for (int j = 0; j < elements.length; j++)
        for (int k = 0; k < elements.length; k++)
            for (int m = 0; m < elements.length; m++) {
                comb = elements[i] + elements[j] + elements[k] + elements[m];
                // do something with the combination
            }


0 commentaires

2
votes

Des solutions récursives semble assez simple aussi:

public class TestCombinations {

public static void main(String[] args) {
    String[] elements = {"a", "b", "c", "1", "2", "3"};
    int maxLength = 4;
    combineStringFromElements(elements, "", maxLength);
}

private static void combineStringFromElements(String[] elements, String currentString, int maxLength) {
    if (currentString.length() == maxLength) {
        System.out.println(currentString);
        return;
    }
    for (String element : elements) {
        combineStringFromElements(elements, currentString + element, maxLength);
    }
}

}


2 commentaires

Aussi une excellente réponse merci, j'ai besoin de vous asseoir et de réfléchir à la récupération de la récursivité et d'essayer de t'éloigner la tête pour comprendre la logique correctement, beaucoup de pensée pour moi !! Merci à tous:)


Merci beaucoup! C'est génial parce que je peux simplement l'écrire directement dans un fichier au lieu de les charger dans la mémoire et le système meurt.



12
votes

Vous allez devoir être plus précis sur ce que vous voulez que votre fonction obtient. Il existe de nombreuses définitions différentes des "combinaisons" et vous n'avez pas précisé que vous souhaitais que vous souhaitiez des combinaisons commandées ou non ordonnées.

mathématiquement, si vous avez n éléments et que vous voulez une liste de k d'entre eux (commandé avec des répétitions), cela vous donne P>

aaaa
aaab
aaac
aaa1
aaa2
aaa3
aaba
aabb
aabc
aab1
...
3323
333a
333b
333c
3331
3332
3333


1 commentaires

Merci beaucoup! Cette solution a résolu mon problème! Je comprends l'idée de la récursion, mais j'essaie toujours d'envelopper ma tête autour de la solution :( C'est fantastique cependant et m'a donné beaucoup de choses à réfléchir, j'aimerais demander de l'aide de comprendre la récursion et exactement comment elle travaille, je vais essayer de le comprendre maintenant, mais je pense que je serai de retour bientôt haha!



4
votes

Si vous le souhaitez en Python, vous n'avez pas besoin de savoir comment programmer!

import itertools
for p in itertools.permutations('abc123', 4):
    print ''.join(p)


2 commentaires

Tout d'abord, la question concerne Java. Deuxièmement, l'ouvre-fil veut savoir comment programmer. Et c'est toujours préférable de savoir, comment faire des choses et pas seulement les aveugles les utiliser ...


seulement marqué comme la question portait sur Java, pas Python. Dans ce cas, Python n'était pas disponible.



0
votes

Voici un code Python qui fait ce que vous voulez: xxx

espère que cela aide

Ce type d'algorithme s'appelle Descente récursive , au cas où vous n'aviez pas vérifié cela déjà.


2 commentaires

Je vous suggère également de mentionner que cela est vraiment nécessaire si itTools.combinations n'est pas disponible.


@ Τζζτζιου: vrai. Je voulais juste montrer comment ça marche sous le capot. Mais vous avez raison, s'il y a une bibliothèque qui fera ce que vous voulez, puis réinventer la roue est rarement la réponse.