2013-10-14 3 views
0

Goodday,PHP/MySQL/GWT Merge последовательности строк, без повторения перестановки

В настоящее время я пытаюсь объединить строки вместе с нескольких массивов и образует перестановку без какого-либо повторения. Совет?

В основном я использую PHP/MySQL/GWT, но я приветствую другой язык, который может помочь сделать это .. спасибо :)

Пример:

array(1, 2, 3); 
array(a, b, c); 
array(!,@,#); 
... 

должны получить:

1) 1a! 
2) [email protected] 
3) 1a# 
4) 1b! 
5) [email protected] 
6) 1b# 
7) 1c! 
8) [email protected] 
9) 1c# 
10) 2a! 
11) [email protected] 
12) 2a# 
13) 2b! 
14) [email protected] 
15) 2b# 
16) 2c! 

... 

================================================================================================================================= ================================ ОБНОВЛЕНИЯ

Кроме того, я нашел альтернативное решение с помощью PHP Finding cartesian product with PHP associative arrays

+0

Из вашего примера это выглядит как первый символ происходит от первого массива, то seoncd символ из второго массива и т.д. Это правило, которое вы хотите ? –

+0

Также вы говорите, что не хотите повторения, но вам также нужно использовать все возможные комбинации? –

+0

Хм, я думаю, что это нехорошо, да, я не хочу повторения, и мне нужны все возможные комбинации, но порядок последовательности важен, например, массив1 должен быть первым символом, array2 должен быть вторым символом, array3 должен быть третьим char ... – Robin1990

ответ

0

Вашего пример выхода всех кортежей декартово произведения трех ваших массивов (не перестановок, который будет смешивать заказы, слишком). Обычно декартово произведение строится с вложенными циклами.

В Java (GWT) это можно сделать следующим образом.

List<String> result = new ArrayList<String>(); 
for(int i=0; i<array1.length; i++) { 
    for(int j=0; j<array1.length; j++) { 
     for(int k=0; k<array1.length; k++) { 
      result.add(array1[i]+array2[j]+array3[k]); 
     } 
    } 
} 

Для декартова произведения, когда число массивов не жестко закодированы, вы можете построить 2D м по п массив всех индексов вам требуется; в этом случае m будет произведением длин массивов, а n будет числом массивов. Следуя вашему примеру, этот массив будет выглядеть так:

0, 0, 0 
0, 0, 1 
0, 0, 2 
0, 1, 0 
0, 1, 1 
... 

Для создания этого массива требуется некоторая бухгалтерская отчетность. Я бы сделал это по столбцу. Например, если у вас есть три массива длин l1, l2 и l3, то последний столбец построен из индекса цикла l3. Второй столбец имеет значения из индекса индекса цикла l2, но каждое значение повторяется l3 раза. Первый столбец имеет значения mod l1, но каждый повторяется l2 * l3 раза. Вы можете создавать повторяющиеся значения с помощью счетчиков: один для номера строки и один для значения: например, когда номер строки номера l3 равен нулю, увеличивайте счетчик на значение, поэтому каждое значение получает l3 строки.

На самом деле, это более общий вопрос также ответил на Perfoming Cartesian product on arrays

+0

Спасибо за быстрый ответ. конечно, это очень хорошая идея, но на ум приходит еще одна вещь. массивы массивов динамические, это означает, что я не мог оценить, сколько наборов существует. есть ли способ улучшить этот алгоритм для этого? – Robin1990

+0

Я добавил к ответу более общий вопрос. – Glenn

+0

Спасибо, что направили меня по правильному пути: D ты спаситель моего дня – Robin1990

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