2

x個のリストがあり、各リストには任意の数の要素があります。各要素は単語です。各リストから 1 つの要素を取得し、各リストから 1 つの単語を含む新しいリストを作成したいと思います。すべてのリストを保存したいと思います。終了したら、単語を追加する可能性ごとに 1 つのリストを作成します。たとえば、4 つのリストがあるとします。

リスト 0: いい
ですね リスト 1:素敵ですね
リスト 2: 素晴らしい
リスト 3: どうやってこれをやったのですか

各リストから要素を取得し、それらを一緒に追加する 1 つの方法は次のとおりです。

新しいリスト 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 + " ");
    }
}

また、すべての結果が 1 つのリストに表示されることもわかっています。しかし、私は何かを機能させてから改善するためにこれを行っているだけです。コードを実行すると、最後のリストから単語が 1 つだけ取得されます。

4

3 に答える 3

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

この質問に対する私の回答をご覧ください。そこで彼はテーブルを使用していましたが、概念は同じであり、私が提案して提供した疑似コードの方法は再帰的でした。頑張ってください、 同様の質問

ここで再帰の経験がある場合は、基本ケースをテストしてから、リストの最初の要素を使用して次のリストに進む場合と、そうでない場合の呼び出しの 2 つを呼び出します。その要素を使用し、現在のリストにとどまります。

このようなものは、明らかに疑似コードなのでコピーペーストしないでください。

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 に答える