Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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_Recursion - Fatal编程技术网

Java 从每个列表中提取一个元素,在“中”;“千方百计”;

Java 从每个列表中提取一个元素,在“中”;“千方百计”;,java,recursion,Java,Recursion,我将有x个列表,每个列表将有任意数量的元素。每个元素都是一个单词。我想从每个列表中提取一个元素,并构建一个新列表,其中包含每个列表中的一个单词。我想存储每个列表,当我完成后,我将有一个列表,为每一个添加单词的可能性。假设我们有4个列表,例如: 列表0:这很好 清单1:你看起来不错 列表2:棒极了 清单3:您是如何做到这一点的 从每个列表中提取一个元素并将其添加到一起的一种方法是: 新列表0:你有多棒 或 新列表1:你这是不是很棒 如何构建适用于任意数量的列表和任意数量的元素的递归算法?我最好用J

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

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

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

新列表0:你有多棒


新列表1:你这是不是很棒

如何构建适用于任意数量的列表和任意数量的元素的递归算法?我最好用Java解决这个问题

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

void everyPossibleWay(HashMap表、ArrayList everyWay、int x、int y、int length、int counter){
if(table.get(x)!=null){
if(y

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

它不是递归的,但您可以尝试以下方法:

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;
    }
    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);
public ArrayList randomWord(ArrayList listWord,int-nbNewList)
{
ArrayList newListWord=新ArrayList();
for(int i=0;i
查看我对这个问题的回答。在那里,他使用了表,但概念是相同的,我建议并提供了伪代码的方法是递归的。祝你好运

如果您在这里有递归方面的经验,您可以测试基本情况,然后进行两次调用,一次调用使用列表中的第一个元素并继续下一个列表,另一次调用不使用该元素并保持在当前列表中

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

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)
}
}
方法构建列表(currentList、RestofList、currentIndex、字符串组合){
restOfLists.removeHead
返回构建列表(restOfLists.getHead,0,组合+currentList.get(currentIndex))
返回构建列表(currentList、RestofList、currentIndex++、组合)

如果(index这个简单的递归方法对我有效:

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;
}
private List getallcombination(列表列表)
{
列表结果=新建ArrayList();
List firstList=lists.get(0);
List newParam=newarraylist(列表);
newParam.remove(0);
如果(!newParam.isEmpty()){
List midresult=getAllCombinations(newParam);
for(字符串:firstList){
对于(列表:midresult){
List listNew=新阵列列表(List);
添加(0,字符串);
结果。添加(列表新建);
}
}
}否则{
for(字符串:firstList){
列表=新的ArrayList();
list.add(字符串);
结果。添加(列表);
}
}
返回结果;
}
可以这样测试:

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;
    }
    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);
List list1=Arrays.asList(“That”、“Is”);
list2=Arrays.asList(“That2”、“Is2”、“all2”);
List param=new ArrayList();
参数添加(列表1);
参数添加(列表2);
param=getAllCombinations(param);

到目前为止你有什么?请发布你迄今为止尝试过的代码。我相信你已经阅读了这个网站上的其他排列示例,并尝试过一些东西,对吗?首先,你想要一个递归算法,它需要随机元素吗?老兄,这看起来有些过头了。另外,我会采取稍微不同的方法:想象你的列表1..用枚举词列出n,即列表1:(0..列表1.length-1),列表2:(0..列表2.length-1)等等。然后只取n个随机数,第k个数在范围内(o..列表k.length-1),然后只选择必要的词(这样,您就不需要每次遍历列表了——只要根据需要多次重复该过程即可)。谢谢,我已经添加了我迄今为止完成的代码。@我还不确定我是否理解您的意思。但元素不会是随机的。只是列表的大小和列表的数量。我问了这个问题;)我让它工作起来了,但不知何故,我很难解决这个问题,尽管它非常相似。哦,这太傻了,让我给你写一些更具体的伪代码,看看是否有帮助。谢谢!但是,我真的不明白我应该如何使用“currentList”和“restOfLists”。是否要详细说明一下?currentList是您当前正在查看的单个元素的列表。您将遍历此列表并使用/不使用每个元素。RestofList是其他列表的列表,每次使用currentList中的元素时,您都会转到RestofList中包含的下一个列表。不幸的是看起来有人刚刚给了你答案,但我希望你对递归有所了解!谢谢!我想我已经开始更多地了解递归了。你为什么要使用随机函数?@TroyAndAbed请删除这个答案,或者修改它,使其与问题相关。使用Java 1.7效果更好