从每个列表中选择一个元素,每个可能的方式"

时间:2013-06-18 13:07:09

标签: java recursion

我将有x个列表,每个列表将包含任意数量的元素。每个元素都是一个单词。我想从每个列表中取一个元素并构建一个包含每个列表中一个单词的新列表。我想存储每个列表,当我完成时,我将有一个列表,列出添加单词的每种可能性。我们假设我们有4个列表,例如:

清单0:那很不错 清单1:你看起来很好
清单2:太棒了 清单3:你是如何做到这一点的

从每个列表中获取元素并将它们添加到一起的一种方法是:

新名单0:你真棒如何


新名单1:你真棒吗

如何构建一个递归算法,该算法适用于具有任意数量元素的任意数量的列表?我想在Java中解决这个问题。

这是我到目前为止所做的(我还没有使用计数器和长度,但我打算用它来获得有趣的组合):

void everyPossibleWay(HashMap<Integer, ArrayList<String>> table, ArrayList<String> everyWay, int x, int y, int length, int counter) {
    if (table.get(x) != null) {
        if (y < table.get(x).size()) {
            everyWay.add(table.get(x).get(y));
            everyPossibleWay(table, everyWay, 0, y + 1, length, counter + 1);
            everyPossibleWay(table, everyWay, x + 1, y, length, counter);   
        }
    }
    else { 
        for (String s : everyWay)
        System.out.println(s + " ");
    }
}

我也知道我会在一个列表中得到所有结果。但我只是这样做才能让事情发挥作用然后改进。当我运行代码时,我只从最后一个列表中得到一个单词。

3 个答案:

答案 0 :(得分:2)

这种安静简单的递归方法对我有用:

private List<List<String>> getAllCombinations(List<List<String>> lists)
{
    List<List<String>> result = new ArrayList<List<String>>();
    List<String> firstList = lists.get(0);
    List<List<String>> newParam = new ArrayList<>(lists);
    newParam.remove(0);
    if (!newParam.isEmpty()) {
        List<List<String>> midresult = getAllCombinations(newParam);
        for (String string : firstList) {
            for (List<String> list : midresult) {
                List<String> listNew = new ArrayList<>(list);
                listNew.add(0, string);
                result.add(listNew);
            }
        }
    } else {
        for (String string : firstList) {
            List<String> list = new ArrayList<String>();
            list.add(string);
            result.add(list);
        }
    }
    return result;
}

可以这样测试:

    List<String> list1 = Arrays.asList("That", "Is");
    List<String> list2 = Arrays.asList("That2", "Is2", "all2");
    List<List<String>> param = new ArrayList<List<String>>();
    param.add(list1);
    param.add(list2);
    param = getAllCombinations(param);

答案 1 :(得分:0)

这不是递归的,但你可以尝试这样的事情:

public ArrayList<ArrayList<String>> randomWord(ArrayList<ArrayList<String>> listWord, int nbNewList)
    {
        ArrayList<ArrayList<String>> newListWord = new ArrayList<ArrayList<String>>();
        for(int i=0; i< nbNewList ; i++)
        {
            ArrayList<String> al = new ArrayList<String>();
            for(ArrayList<String> al2 : listWord)
            {
                al.add(al2.get((int)(Math.random() * (al2.size()-1))));
            }
            newListWord.add(al);
        }

        return newListWord;
    }

答案 2 :(得分:0)

查看我对这个问题的回答。他在那里使用表,但概念是相同的,我建议的方法和提供的伪代码是递归的。祝好运, Similar Question

如果您有任何递归经验,那么您要做的就是测试基本情况,然后进行两次调用,一次使用列表中的第一个元素并继续下一个列表,然后调用一个你不要使用那个元素并保留在当前列表中。

像这样的东西,显然它是伪代码所以不要复制粘贴!

method buildLists(currentList, restOfLists, currentIndex, String combination){
restOfLists.removeHead
return buildLists(restOfLists.getHead, 0, combination + currentList.get(currentIndex))
return buildLists(currentList, restOfLists, currentIndex++, combination)
if(index<currentList.size()-1 restOfLists.isNull){
combinationList.add(combination)
}
}