2015-08-11 3 views
0

У меня есть 13 массивов, содержащих уникальные символы. Я хочу, чтобы найти и распечатать все возможные комбинации всех возможных комбинаций каждого массива в текстовый файл.Поиск всех возможных комбинаций всех возможных комбинаций массивов

Однако каждый массив имеет разную длину в диапазоне от 1 до 4 символов. Кроме того, я не хочу изменять порядок массивов, просто содержимое массива.

Мои массивы:

0 'Q' 

1 'J' 

2 'H','R' 

3 'G','Y' 

4 'D','L','C','U' 

5 'E','T','A','O' 

6 'W','F' 

7 'I','N','S' 

8 'Z' 

9 'X' 

10 'V','K' 

11 'P','B' 

12 'M' 

Окончательный порядок массив должен быть: 0,1,2,3,4,5,6,7,8,9,10,11,12

В отличие от что-то вроде 0,2,4,6,8,7,5,3,1,9,10,11,12

Каждая комбинация символов в массивах 0 до 12 должно быть уникальным , Если бы я правильно вычислил это, должно быть несколько более 100 000 различных комбинаций.

Я не могу обдумать, как решить эту проблему, которую я создал для себя, и поэтому любая помощь очень ценится.

+1

Этот вопрос мне не ясен. –

+0

Какой выход вы ищете ... может предоставить нам некоторый образец вывода? –

ответ

3

Рекурсия должно помочь вам собрать 1536 комбинации:

public static void main(String[] args) { 
    List<char[]> characters = Arrays.asList(
      new char[][]{ 
       {'Q'}, 
       {'J'}, 
       {'H', 'R'}, 
       {'G', 'Y'}, 
       {'D', 'L', 'C', 'U'}, 
       {'E', 'T', 'A', 'O'}, 
       {'W', 'F'}, 
       {'I', 'N', 'S'}, 
       {'Z'}, 
       {'X'}, 
       {'V', 'K'}, 
       {'P', 'B'}, 
       {'M'}}); 
    printCombinationsToFile("", characters); 
} 

static void printCombinationsToFile(String leadPart, List<char[]> characters) { 
    if (characters.size() == 1) { 
     for (char singleChar : characters.get(0)) { 
      // print your result string to your file 
      System.out.println(leadPart + singleChar); 
     } 
    } else { 
     List<char[]> remainingCharacters = characters.subList(1, characters.size()); 
     for (char singleChar : characters.get(0)) { 
      // recursively collect all other combinations 
      printCombinationsToFile(leadPart + singleChar, remainingCharacters); 
     } 
    } 
} 

Это производит следующий вывод:

QJHGDEWIZXVPM 
QJHGDEWIZXVBM 
QJHGDEWIZXKPM 
QJHGDEWIZXKBM 
QJHGDEWNZXVPM 
QJHGDEWNZXVBM 
QJHGDEWNZXKPM 
QJHGDEWNZXKBM 
QJHGDEWSZXVPM 
QJHGDEWSZXVBM 
QJHGDEWSZXKPM 
QJHGDEWSZXKBM 
... 

Просто замените System.out.println(leadPart + singleChar); с командой записи файла.


По вашему комментарию, этот метод должен быть то, что вы хотите:

static void printCombinationsToFile(String leadPart, List<char[]> characters) { 
    if (characters.isEmpty()) { 
     // print your result string to your file 
     System.out.println(leadPart); 
    } else { 
     List<char[]> remainingCharacters = characters.subList(1, characters.size()); 
     char[] currentLevel = characters.get(0); 
     for (int index = 0; index < currentLevel.length; index++) { 
      List<char[]> remainingCombinations; 
      if (currentLevel.length == 1) { 
       remainingCombinations = remainingCharacters; 
      } else { 
       char[] currentLevelMinusOne = new char[currentLevel.length - 1]; 
       if (index > 0) { 
        System.arraycopy(currentLevel, 0, currentLevelMinusOne, 0, index); 
       } 
       if (index < currentLevelMinusOne.length) { 
        System.arraycopy(currentLevel, index + 1, 
          currentLevelMinusOne, index, currentLevelMinusOne.length - index); 
       } 
       remainingCombinations = new LinkedList<char[]>(remainingCharacters); 
       remainingCombinations.add(0, currentLevelMinusOne); 
      } 
      // recursively collect all other combinations 
      printCombinationsToFile(leadPart + currentLevel[index], remainingCombinations); 
     } 
    } 
} 

Это производит 110592 комбинаций в следующем формате:

... 
QJRHYGUCLDOAETFWSNIZXKVPBM 
QJRHYGUCLDOAETFWSNIZXKVBPM 
QJRHYGUCLDOATEWFINSZXVKPBM 
QJRHYGUCLDOATEWFINSZXVKBPM 
QJRHYGUCLDOATEWFINSZXKVPBM 
QJRHYGUCLDOATEWFINSZXKVBPM 
... 
+0

Благодарим за отзыв. Результат вашего кода очень похож на мой желаемый результат, однако я хочу, чтобы все 26 символов были распечатаны, а не только для каждого подкласса символов –

+0

@ S.Eisner. Я добавил вторую версию здания комбинации к моему ответу. Соответствует ли это вашим требованиям? По крайней мере, количество комбинаций теперь ближе к вашей первоначальной оценке. – Carsten

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