2013-08-07 3 views
0

Например, у меня есть массив ["Sam", "Mary", "John"].
Я хотел бы, чтобы отобразить комбинацию выбрать 2 из 3.
Результаты должны быть:Как отобразить комбинацию некоторых значений в массиве?

[Sam, Mary] 
[Sam, John] 
[Mary, John] 

Я исследовал много, но все еще серовато знают, как это сделать.
Конечно, этот пример содержит только 3 человека.
Фактически, количество людей в целом будет больше, например. 15

Вот что я нашел:
Algorithm to return all combinations of k elements from n

What is a good way to implement choose notation in Java?

Некоторые из них отображаются только значение Ncr, но не выдавая комбинацию.

+0

В вашем примере порядок имеет значение, но вы говорите, что хотите комбинацию (подразумевая, что это не так). Что он? – Daniel

+1

Вы всегда хотите выбрать пары, или размер комбинаций будет когда-либо изменяться? – Michelle

+0

Первая ссылка в вашем вопросе ([Алгоритм для возврата всех комбинаций элементов k из n] (http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from -n)) содержит много ответов на ваш вопрос. – Carsten

ответ

1

Простая рекурсивная функция для распечатки комбинации (Ncr) заданного массива строк (названный array):

String[] array = {"Sam", "Mary", "John"}; 

public void function(int counter, String comb_Str, int r) { 
     if (r == 0) { 
      System.out.println(comb_Str);    
     } else { 
      for (; counter < array.length; ++counter) { 
       function(counter + 1, comb_Str + " " + array[counter], r - 1); 
      } 
     } 
    } 

называется использованием function(0, "", #r value#)

г значение должно быть < = п значение (длина массива)

+0

Я пытаюсь бежать, но ничего не печатаю. Когда он запускает первый цикл for, он завершает работу. – jjLin

+0

use 'function (0," ", 2);' для вашего примера выше @jjLin –

+0

первый параметр не 'n', а счетчик/используемый для отслеживания строки в массиве –

0

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

/** 
* @param list The list to create all combos for 
* @param comboSize The size of the combo lists to build (e.g. 2 for 2 items combos) 
* @param startingIndex The starting index to consider (used mainly for recursion). Set to 0 to consider all items. 
*/ 
getAllCombos(list, comboSize, startingIndex){ 
    allCombos; 

    itemsToConsider = list.length - startingIndex; 
    if(itemsToConsider >= comboSize){ 
     allCombos = getAllCombos(list, comboSize, startingIndex + 1); 

     entry = list[startingIndex]; 
     if(comboSize == 1){ 
      singleList; 
      singleList.add(entry); 
      allCombos.add(singleList); 
     } else { 
      subListCombos = getAllCombos(list, comboSize - 1, i+1); 
      for(int i = 0; i < subListCombos.length; i++){ 
       subListCombo = subListCombos[i]; 
       subListCombo.add(entry); 
       allCombos.add(subListCombo); 
      } 
     } 
    } 

    return allCombos; 
} 
2
public static int width; 

    public static void main(String [] args){ 

     String[] array = {"one", "two", "three", "four", "five"}; 

     width = 3; 

     List<String> list = new ArrayList<String>(); 

     for (int i = 0; i < array.length; i++){ 
      method(array, list, i, 1, "[" + array[i]); 
     } 

     System.out.println(list); 
    } 


    public static void method(String[] array, List<String> list, int i, int depth, String string){ 

     if (depth == width){ 
      list.add(string + "]"); 
      return; 
     } 

     for (int j = i+1; j < array.length; j++){ 
      method(array, list, j, depth+1, string + ", " + array[j]); 
     } 
    } 
+0

Можете ли вы дать некоторое объяснение рекурсии, потому что Я не очень понимаю. – jjLin

+1

Проверьте этот вопрос: http://stackoverflow.com/questions/9199984/basic-java-recursion-method – Brinnis

0

Это, вероятно, не является совершенным, но он должен получить вас на правильном пути. Создайте функцию для получения комбинаций для каждого элемента. Затем вам нужно просто прокрутить каждый элемент и вызвать функцию на каждом из них.

int num = 2; //Number of elements per combination 

for(int i=0; i <= (array.length - num); i++) { 
    String comb = "[" + array[i]; 
    comb += getComb(i,num); 
    comb += "]"; 
    println(comb); 
} 

String getComb(int i, int num) { 
    int counter = 1; 
    String s = ""; 

    while(counter < num) { 
     s += ", " + array[i+counter]; 
     counter++; 
    } 

    return s; 
}