2011-12-22 8 views
2

У меня есть массив символов из A, B, C, и я хочу, чтобы напечатать выход как:Комбинации алфавита в массив символов

A,B,C,AB,AC,BC,ABC

будут оценены любые предложения ...

public class CharArray { 
    public static void main(String[] args) { 
     char alpha[] = {'A', 'B', 'C'}; 
     for(char s : alpha) { 
        //what to do now 
     } 

    } 

} 
+0

Вы хотите * перестановкам * или все * комбинации *? – dasblinkenlight

+0

Я хочу, чтобы все комбинации не были перестановками. Итак, предположим, что массив Char - это «A, B, C», тогда вывод должен быть таким, как «A, B, C, AB, AC, BC, ABC», но не BA, CA, CB и CBA. – AKIWEB

ответ

5

Отпечатаны сочетания, как в вашем примере, не перестановки, как и в названии вопроса.

char alpha[] = {'A', 'B', 'C'}; 
for (int m = 1 ; m != 1<<alpha.length ; m++) { 
    for (int i = 0 ; i != alpha.length ; i++) { 
     if ((m & (1<<i)) != 0) { 
      System.out.print(alpha[i]); 
     } 
    } 
    System.out.println(); 
} 
+0

+1 - Это круто! – OldCurmudgeon

+0

Можем ли мы иметь некоторые замечания о том, как/почему это работает, или ссылка, пожалуйста? – OldCurmudgeon

+0

О, я понял! m идет от 1 до (1 << n) - 1 (7 в этом случае), таким образом перечисляя 001b, 010b, 011b, ... 111b, который является всеми комбинациями из трех элементов. Внутренний цикл просто проверяет каждый бит и печатает, если это 1. Силл очень приятный. :) – OldCurmudgeon

0

Еще одна возможность рассмотреть в guava (java-библиотеку с открытым исходным кодом google).

наборы (набор утилит класса)

/** Returns the set of all possible subsets of set. For example, powerSet(ImmutableSet.of(1, 2)) returns the set {{}, {1}, {2}, {1, 2}}... */ 
     public static <E> Set<Set<E>> powerSet(Set<E> set) 

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Sets.html#powerSet(java.util.Set)

Смежные вопросы