Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归函数,以获取动态列表数的组合_Java_Loops_For Loop_Recursion - Fatal编程技术网

Java 递归函数,以获取动态列表数的组合

Java 递归函数,以获取动态列表数的组合,java,loops,for-loop,recursion,Java,Loops,For Loop,Recursion,我正试图编写一个递归函数,从动态列表数中获得所有可能的组合。例如,如果我有3个列表 List 1 : {A,B} List 2 : {B,C} List 3 : {D} 即使在输出中,每个元素只出现一次,我还是希望将输出保持在 List<List<List<elements>>> 在这里,列表的数量可以动态变化。所以我需要动态的嵌套循环数来找到组合 这就是我想要的。别理我那糟糕的代码 public List<List<List<eleme

我正试图编写一个递归函数,从动态列表数中获得所有可能的组合。例如,如果我有3个列表

List 1 : {A,B}
List 2 : {B,C}
List 3 : {D}
即使在输出中,每个元素只出现一次,我还是希望将输出保持在

List<List<List<elements>>>
在这里,列表的数量可以动态变化。所以我需要动态的嵌套循环数来找到组合

这就是我想要的。别理我那糟糕的代码

public List<List<List<elements>>> combinations(int depth, List<List<elements>> allLists,List<List<List<elements>>> answerList){

if(depth==allList.size())
 return answerList
 }
else{ 
 for(List<element> e : answerList){
    for(int j=0; j<e.size();j++){
      answerList.get(depth).get(j).add(allList.get(depth).get(j));
combinations (depth+1,allLists,answerList)
}
}
}

您需要一个非常常见的递归模式,在该模式中,您维护一个包含构建到当前级别的状态的变量。这里有一些代码给你

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

public class Main 
{
  public static void recurse(int depth,
                      List<List<String>> current,
                      List<List<List<String>>> result,
                      List<List<String>> lists)
  {
    if (depth == lists.size()) {
      // Copy the list to the result
      result.add(new ArrayList<List<String>>(current));
      return;
    }
    // Iterate over the current-depth list
    List<String> list = lists.get(depth);
    for (String str: list) {
      List<String> elem = Arrays.asList(str);
      current.add(elem);   // Add the next element to the list
      recurse(depth + 1, current, result, lists);
      current.remove(depth);  // Clean up this element
    }
  }

  public static List<List<List<String>>> combinations(List<List<String>> allLists) 
  {
      // We'll fill it in
      List<List<List<String>>> result = new ArrayList<>();

      // Current, partial row in the final result
      List<List<String>> current = new ArrayList<>();

      recurse(0, current, result, allLists);

      return result;
  }

  public static void main(String[] args) {

    System.out.println("Hello World!");

    List<String> list1 = Arrays.asList("A", "B");
    List<String> list2 = Arrays.asList("B", "C", "E");
    List<String> list3 = Arrays.asList("D", "X");

    List<List<String>> allLists = Arrays.asList(list1, list2, list3);

    List<List<List<String>>> result = combinations(allLists);

    // Print
    for (List<List<String>> list: result) {
      System.out.print("{ ");
      for (List<String> elem: list)
        System.out.print("{" + elem.get(0) + "} ");
      System.out.println("}");
    }
  }
}
导入java.util.array;
导入java.util.List;
导入java.util.ArrayList;
公共班机
{
公共静态无效递归(int-depth,
列出当前,
列出结果,
(列表)
{
if(depth==lists.size()){
//将列表复制到结果
结果.添加(新ArrayList(当前));
返回;
}
//迭代当前深度列表
List=lists.get(深度);
for(字符串str:list){
List elem=Arrays.asList(str);
current.add(elem);//将下一个元素添加到列表中
递归(深度+1、当前、结果、列表);
current.remove(深度);//清除此元素
}
}
公共静态列表组合(列表所有列表)
{
//我们会填的
列表结果=新建ArrayList();
//最终结果中的当前、部分行
当前列表=新的ArrayList();
递归(0,当前,结果,所有列表);
返回结果;
}
公共静态void main(字符串[]args){
System.out.println(“你好,世界!”);
list1=Arrays.asList(“A”、“B”);
list2=Arrays.asList(“B”、“C”、“E”);
list3=Arrays.asList(“D”,“X”);
List allLists=Arrays.asList(list1、list2、list3);
列表结果=组合(所有列表);
//印刷品
对于(列表:结果){
系统输出打印(“{”);
对于(列表元素:列表)
System.out.print(“{”+元素get(0)+”}”);
System.out.println(“}”);
}
}
}

顺便说一句,你可以在没有第三级列表的情况下简化它,如@dasblinkenlight建议的

有五个列表,你希望构建
列表
?你能检查一下这个问题吗:你能解释一下列表列表应该包含什么吗?理解所需的输出有点困难(如果您想在这个特定的结构中使用它)。列表的元素是什么?@dasblinkenlight我已经在问题中解释了我的结构。请检查我的编辑。“谢谢你!”真怀疑论者我已经在编辑中解释了我的结构。现在也考虑元素为字符串。
 {
   {
     {A},
     {B},
     {D}
   },
   {
     {A},
     {C},
     {D}
   },
   {
     {B},
     {B},
     {D}
   },
   {
     {B},
     {C},
     {D}
   }
 }
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

public class Main 
{
  public static void recurse(int depth,
                      List<List<String>> current,
                      List<List<List<String>>> result,
                      List<List<String>> lists)
  {
    if (depth == lists.size()) {
      // Copy the list to the result
      result.add(new ArrayList<List<String>>(current));
      return;
    }
    // Iterate over the current-depth list
    List<String> list = lists.get(depth);
    for (String str: list) {
      List<String> elem = Arrays.asList(str);
      current.add(elem);   // Add the next element to the list
      recurse(depth + 1, current, result, lists);
      current.remove(depth);  // Clean up this element
    }
  }

  public static List<List<List<String>>> combinations(List<List<String>> allLists) 
  {
      // We'll fill it in
      List<List<List<String>>> result = new ArrayList<>();

      // Current, partial row in the final result
      List<List<String>> current = new ArrayList<>();

      recurse(0, current, result, allLists);

      return result;
  }

  public static void main(String[] args) {

    System.out.println("Hello World!");

    List<String> list1 = Arrays.asList("A", "B");
    List<String> list2 = Arrays.asList("B", "C", "E");
    List<String> list3 = Arrays.asList("D", "X");

    List<List<String>> allLists = Arrays.asList(list1, list2, list3);

    List<List<List<String>>> result = combinations(allLists);

    // Print
    for (List<List<String>> list: result) {
      System.out.print("{ ");
      for (List<String> elem: list)
        System.out.print("{" + elem.get(0) + "} ");
      System.out.println("}");
    }
  }
}