2

我将有 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 + " ");
    }
}

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

4

3 回答 3

2

This quiet simple recursive method works for me:

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;
}

Can be tested like this:

    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);
于 2013-06-18T14:20:54.203 回答
0

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

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

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

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)
}
}
于 2013-06-18T13:23:14.053 回答
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;
    }
于 2013-06-18T13:20:00.170 回答