Java使用递归void函数的结果,将每个添加到list并返回另一个函数

时间:2016-04-11 17:30:43

标签: java list recursion void

我正在使用递归算法的修改版本,我偶然发现它返回了一组数据的所有组合。例如:如果数据集恰好是[“ABCD”,“ACDEF”,“ABDFG”,“BDEF”,“CGEGD”],我希望列表中有以下内容,即每个唯一元素都与指定长度的另一个唯一元素。

ABC,ABD,ABE,ABF,ABG,ACD,ACE,ACF,ACG,ADE,ADF,ADG,AEF,AEG,AFG,BCD,BCE,BCF,BCG,BDE,BDF,BDG,BEF,BEG ,BFG,CDE,CDF,CDG,CEF,CEG,CFG,DEF,DEG,DFG,EFG

到目前为止,这是我的课程:

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

class Comboo {

    public static void combinationAssShit(String arr[], String data[], int start, int end, int index, int r){

    if (index == r)
     {
         for (int j=0; j<r; j++)
             System.out.print(data[j]+" ");

         System.out.println("");
         return;
     }

     for (int i=start; i<=end && end-i >= r-index; i++)
     {
         data[index] = arr[i];
         combinationAssShit(arr, data, i+1, end, index+1, r);
     }
 }

    public static void printCombination(String arr[], int n, int r)
    {
        String data[]=new String[r]; 
        combinationAssShit(arr, data, 0, n, 0, r);
    }

    public static String[] singleElem(String[] data) {
        List<String> single = new ArrayList<String>(); 

        for (String element: data) {
            for (int x = 0; x < element.length(); x++) {
                single.add(Character.toString(element.charAt(x)));
            }
        }

        Set<String> singleS = new LinkedHashSet<String>(single); 

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

        singleL.addAll(singleS); 

        String[] john = singleL.toArray(new String[singleL.size()]);
        return john;
    }

    public static void main (String[] args) {
        String arr[] = {"ABCD", "ACDEF", "ABDFG", "BDEF", "CGEGD"};
        int r = 3;

        String[] t = singleElem(arr);
        int n = t.length;
        printCombination(t, n, r);
    }
}

请注意。我知道有很多更正要做。我也是Java的新手。我已经习惯了C ++和Python,在这个问题的情况下,通过从组合生成器中获得结果,可以更容易地收集列表中的组合。

2 个答案:

答案 0 :(得分:1)

如果您要做的是返回最终结果(字符串),您可以将递归过程中的所有代码抛出到另一个辅助方法中,并让初始方法调用帮助程序并返回结果。 当然,您还需要使递归助手和方法都无效,以便通过返回传递结果。

答案 1 :(得分:1)

将方法的返回类型更改为List<String>,并将值添加到列表中:

public static List<String> combinationAssShit(String arr[], String data[], int start, int end, int index, int r){
  List<String> result = new ArrayList<>();
  if (index == r) {
    StringBuilder sb = new StringBuilder();
    for (int j=0; j<r; j++) {
      sb.append(data[j]);
      sb.append(" ");
    }
    result.add(sb.toString());
  } else {
    for (int i=start; i<=end && end-i >= r-index; i++)
    {
      data[index] = arr[i];
      result.addAll(combinationAssShit(arr, data, i+1, end, index+1, r));
    }
  }
  return result;
}

或者,您可以将List<String>作为参数添加到方法中,这样您就不必继续创建新实例:

public static void combinationAssShit(
    String arr[], String data[], int start, int end, int index, int r,
    List<String> result){