Java - листинговые комбинации - PullRequest
0 голосов
/ 12 февраля 2012

Я пишу программу для перечисления всех возможных комбинаций букв A, B, C и D. Я успешно написал программу для перечисления всех возможных перестановок.

Тем не менее, как бы я переписал программу для работы и создания всех комбинаций (т. Е. ABCD = DCBA и AB = BA, поэтому, пока одно есть, другое не должно быть в списке).

Пока код моей текущей программы:

import java.util.ArrayList;

public class Perms {

    public static void main(String[] args) {

        ArrayList<Character> characters = new ArrayList<Character>();

        characters.add('A');
        characters.add('B');
        characters.add('C');
        characters.add('D');

        int count = 0;

        for (int i = 0; i < characters.size(); i++) {
            for (int j = 0; j < characters.size(); j++) {
                for (int k = 0; k < characters.size(); k++) {
                    for (int d = 0; d < characters.size(); d++) {
                        count++;
                        System.out.println(count + ": " + characters.get(i) + characters.get(j) + characters.get(k) + characters.get(d));
                    }
                }
            }
        }

    }
}

Ответы [ 4 ]

5 голосов
/ 12 февраля 2012

Ваш второй регистр эквивалентен списку двоичных значений из 4 цифр. Давайте предположим, что A - самая правая цифра, а D - самая левая. Всего 16 комбинаций:

DCBA
0000
0001
0010
0011
0100
...
1110
1111

Каждая комбинация декодируется следующим образом:

DCBA
1010 = DB

, так как есть позиции в позициях B и D.

У вас есть несколько способов генерировать и / или декодировать двоичные числа в Java.

Например, с побитовыми операциями:

public static void main(String[] args) {

    // starting from 1 since 0000 is not needed
    for(int i=1; i<16; ++i) {

        // bitwise operation & detects 1 in given position,
        // positions are determined by sa called "masks" 
        // mask has 1 in position you wish to extract
        // masks are 0001=1, 0010=2, 0100=4 and 1000=8
        if( (i & 1) > 0 ) System.out.print("A");
        if( (i & 2) > 0 ) System.out.print("B");
        if( (i & 4) > 0 ) System.out.print("C");
        if( (i & 8) > 0 ) System.out.print("D");

        System.out.println("");

    }
}
1 голос
/ 13 февраля 2012

Взгляните на Рекурсивное решение Питера Лоури , которое обрабатывает комбинации списка, содержащего повторяющиеся значения.

1 голос
/ 12 февраля 2012
// Returns all combinations of a List of Characters (as Strings)
// THIS METHOD MODIFIES ITS ARGUMENT! Make sure to copy defensively if necessary
List<String> charCombinations(List<Character> chars)
{
  if(chars.isEmpty())
  {
    List<String> result = new ArrayList<String>();
    result.add("");
    return result;
  }
  else
  {
     Character    c      = chars.remove(0);
     List<String> result = charCombinations(chars);
     int          size   = result.size();
     for(int i = 0; i < size; i++)
       result.add(c + result.get(i));
     return result;
  }
}

Я использовал List в качестве аргумента, потому что Set не имеет метода для извлечения одного элемента из набора.

1 голос
/ 12 февраля 2012

Вот мой код вашей проблемы:)

Мне очень жаль, что мой ответ выглядит ужасно, потому что я только что пришел на Java.

import java.util.Vector;

public class StackOverFlow {

    static int n ;
    static Vector<String> set;
    static int[] d ;
    public static void recursion(int t){
        if(t==n){
            PRINT();
            return;
        }
        d[t]=1;
        recursion(t+1);
        d[t]=0;
        recursion(t+1);
    }

    public static void PRINT(){
        System.out.println("ANSWER");
        for(int i=0;i<n;i++)
            if(d[i]==1) System.out.println(set.elementAt(i));
    }


    public static void main(String[] args) {                   
        n = 4;
        set = new Vector<String>(4);
        d = new int[6];
        set.add("a");
        set.add("b");
        set.add("c");
        set.add("d");
        recursion(0);
    }
}
...