Java 如何在ArrayList中找到不同大小字符串的所有递归组合参见示例

Java 如何在ArrayList中找到不同大小字符串的所有递归组合参见示例,java,recursion,arraylist,Java,Recursion,Arraylist,显然,这几乎是不可能理解的 下面是一个例子: 如果我有一个ArrayList=[“abc”,“def”] 那么我想要的结果是: ad ae af bd be bf cd ce cf 如果我有一个ArrayList=[“ab”,“cd”,“efg”],也可以假设同样的情况: 其中显示了所有选项。第一个索引字符串对应于结果的第一个“潜在”字母。第二个与第二个相对应,依此类推。我一直在研究不同形式的递归,但我似乎遇到了麻烦。以下是我到目前为止的情况: public static void mai

显然,这几乎是不可能理解的

下面是一个例子: 如果我有一个ArrayList=[“abc”,“def”] 那么我想要的结果是:

ad ae af 
bd be bf 
cd ce cf
如果我有一个ArrayList=[“ab”,“cd”,“efg”],也可以假设同样的情况:

其中显示了所有选项。第一个索引字符串对应于结果的第一个“潜在”字母。第二个与第二个相对应,依此类推。我一直在研究不同形式的递归,但我似乎遇到了麻烦。以下是我到目前为止的情况:

public static void main(String[] args) {
    ArrayList<String> param = new ArrayList<String>();
    param.add("jkl");
    param.add("mno");
    param.add("pqrs");
    System.out.println(giveFrag(param, 0));
}
static String giveLetter(String s, int indexForString) {
    // return the letter given
    return s.substring(indexForString, indexForString+1);
}
static String giveFrag(ArrayList<String> strs, int start) {
    String output = "";
    if (start == strs.size()-1) {
        output = giveLetter(strs.get(start),0);
    } else {
        for (int i = 0; i < strs.get(start).length(); i++) {
            String q = strs.get(start).substring(i,i+1);
            output += q;
            for (int k = strs.size()-1; k < strs.size(); k++) {
                output += giveFrag(strs, start+1);
            }
            output += " ";
        }
        output += "\n";
    }
    return output;
}
现在,回到实际问题!首先,如果有人发现任何会产生此结果的明显错误,而不是:

jmp jnp jop
kmp knp kop
lmp lnp lop
请让我知道。如果没有任何明显的问题,并且需要进行整体重组,请您具体说明我应该做什么

此外,如果任何人手头有任何额外的时间,他们能找到一种方法在迭代时包含最后一个数组元素吗


非常感谢您的帮助,并为这个令人难以置信的模糊标题感到抱歉。

当前输出与问题描述不匹配。 输出的第一行应该是:

jmp jmq jmr jms
实现并不真正接近您所需要的。 考虑这个问题:

private void accumulateFrags(List<String> strings, int start, String prefix, List<String> frags) {
  if (start == strings.size()) {
    frags.add(prefix);
    return;
  }
  String current = strings.get(start);
  for (char c : current.toCharArray()) {
    accumulateFrags(strings, start + 1, prefix + c, frags);
  }
}
private void累加器标签(列表字符串、int开头、字符串前缀、列表碎片){
if(start==strings.size()){
frags.add(前缀);
返回;
}
字符串电流=strings.get(开始);
for(char c:current.toCharArray()){
累加器标签(字符串、开始+1、前缀+c、碎片);
}
}
此函数将在列表中累积所有组合。 可以这样称呼:

List<String> frags = new ArrayList<>();
accumulateFrags(Arrays.asList("jkl", "mno", "pqrs"), 0, "", frags);
System.out.println(frags);
List frags=new ArrayList();
累加器标签(Arrays.asList(“jkl”、“mno”、“pqrs”)、0、“、frags);
系统输出打印(frags);
这不会产生您想要的逐行输出。 但这应该相当简单,
因此,我将此作为练习留给您。

当前输出与问题描述不匹配。 输出的第一行应该是:

jmp jmq jmr jms
实现并不真正接近您所需要的。 考虑这个问题:

private void accumulateFrags(List<String> strings, int start, String prefix, List<String> frags) {
  if (start == strings.size()) {
    frags.add(prefix);
    return;
  }
  String current = strings.get(start);
  for (char c : current.toCharArray()) {
    accumulateFrags(strings, start + 1, prefix + c, frags);
  }
}
private void累加器标签(列表字符串、int开头、字符串前缀、列表碎片){
if(start==strings.size()){
frags.add(前缀);
返回;
}
字符串电流=strings.get(开始);
for(char c:current.toCharArray()){
累加器标签(字符串、开始+1、前缀+c、碎片);
}
}
此函数将在列表中累积所有组合。 可以这样称呼:

List<String> frags = new ArrayList<>();
accumulateFrags(Arrays.asList("jkl", "mno", "pqrs"), 0, "", frags);
System.out.println(frags);
List frags=new ArrayList();
累加器标签(Arrays.asList(“jkl”、“mno”、“pqrs”)、0、“、frags);
系统输出打印(frags);
这不会产生您想要的逐行输出。 但这应该相当简单, 所以我把它留给你们做练习。

// arguments are passed using the text field below this editor
public static void main(String[] args)
{
String arr[] = {"jkl", "mno", "pqrs"};

List<String> res = new ArrayList<String>();
constructStr(res, "", 0, arr);


String s = "";
for (int i=0; i<res.size(); i++) {
  int mod = arr[arr.length-1].length();
  if (i % mod == 0) {
    System.out.println(s); 
    s = res.get(i) + " ";
  }
  else {
    s += res.get(i) + " ";
  }
}
System.out.println(s); 
}

private static void constructStr(List<String> result, String curStr, int i, String arr[]) {
if (i + 1 < arr.length) {
  for (int k=0; k<arr[i].length(); k++) {
    constructStr(result, curStr + arr[i].charAt(k), i + 1, arr);
  }
}
else {
  for (int k=0; k<arr[i].length(); k++) {
    result.add(curStr + arr[i].charAt(k));
  }
}    
}
//使用此编辑器下面的文本字段传递参数
公共静态void main(字符串[]args)
{
字符串arr[]={“jkl”、“mno”、“pqrs”};
List res=new ArrayList();
str(res,“,0,arr);
字符串s=“”;
对于(int i=0;i递归

// arguments are passed using the text field below this editor
public static void main(String[] args)
{
String arr[] = {"jkl", "mno", "pqrs"};

List<String> res = new ArrayList<String>();
constructStr(res, "", 0, arr);


String s = "";
for (int i=0; i<res.size(); i++) {
  int mod = arr[arr.length-1].length();
  if (i % mod == 0) {
    System.out.println(s); 
    s = res.get(i) + " ";
  }
  else {
    s += res.get(i) + " ";
  }
}
System.out.println(s); 
}

private static void constructStr(List<String> result, String curStr, int i, String arr[]) {
if (i + 1 < arr.length) {
  for (int k=0; k<arr[i].length(); k++) {
    constructStr(result, curStr + arr[i].charAt(k), i + 1, arr);
  }
}
else {
  for (int k=0; k<arr[i].length(); k++) {
    result.add(curStr + arr[i].charAt(k));
  }
}    
}
//使用此编辑器下面的文本字段传递参数
公共静态void main(字符串[]args)
{
字符串arr[]={“jkl”、“mno”、“pqrs”};
List res=new ArrayList();
str(res,“,0,arr);
字符串s=“”;

对于(int i=0;iAh,我明白我现在做错了什么!在我看来,我没有对每个片段中的每个字符进行迭代。哦,要回答为什么结果不正确,那是因为我过度简化了它。请看代码下的通知。非常感谢您的快速响应!啊,我明白我现在做错了什么!我觉得我没有迭代每个片段中的每个字符。哦,要回答为什么结果不正确,那是因为我过度简化了它。请参阅代码下的通知。非常感谢您的快速响应!