本文介紹了列表列的笛卡爾積的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個問題,這實際上是一個一般的編程問題,但我的實現是用Java實現的,所以我將通過這種方式提供我的示例
我有一個這樣的類:
public class Foo {
LinkedHashMap<String, Vector<String>> dataStructure;
public Foo(LinkedHashMap<String, Vector<String>> dataStructure) {
this.dataStructure = dataStructure;
}
public String[][] allUniqueCombinations() {
//this is what I need to do
}
}
我需要從LinkedHashMap
生成一個嵌套數組,該數組表示LHM中所有值的每個唯一組合。例如,如果我的LHM看起來像這樣(偽代碼,但我認為您可以理解..):
{"foo" => ["1","2","3"], "bar" => ["3","2"], "baz" => ["5","6","7"]};
那么我的String[][]
應該是這樣的:
{
{"foo","bar","baz"},
{"1","3","5"},
{"1","2","5"},
{"1","3","6"},
{"1","2","6"},
{"1","3","7"},
{"1","2","7"},
{"2","3","5"},
{"2","2","5"},
{"2","3","6"},
{"2","2","6"},
{"2","3","7"},
{"2","2","7"},
{"3","3","5"},
{"3","2","5"},
{"3","3","6"},
{"3","2","6"},
{"3","3","7"},
{"3","2","7"},
}
我認為這些都是我手工制作的(顯然),所以我可能遺漏了一套,但我認為這說明了我正在嘗試做的事情。只要所有獨特的組合都存在,每套游戲的順序并不重要。同樣需要說明的是,您不知道LHM中有多少元素,也不知道后續的每個向量中有多少元素。我已經找到了與以下情況相匹配的答案:您需要單個數組中所有元素的所有唯一組合,但沒有一個完全符合這種情況。
更新:我將類型更改為字符串,因為我的真實示例實際上是字符串。我試圖使用整數使該示例更具可讀性,但到目前為止我得到的答案不能很好地轉換為字符串。所以,是的,它們是數字,但在我的實際情況中,它們將是除了使用此特定應用程序的人之外對任何人都沒有多大意義的字符串。所以,這只是它的一個抽象。
推薦答案
嘗試如下:
public static void generate(int[][] sets) {
int solutions = 1;
for(int i = 0; i < sets.length; solutions *= sets[i].length, i++);
for(int i = 0; i < solutions; i++) {
int j = 1;
for(int[] set : sets) {
System.out.print(set[(i/j)%set.length] + " ");
j *= set.length;
}
System.out.println();
}
}
public static void main(String[] args) {
generate(new int[][]{{1,2,3}, {3,2}, {5,6,7}});
}
哪個將打印:
1 3 5
2 3 5
3 3 5
1 2 5
2 2 5
3 2 5
1 3 6
2 3 6
3 3 6
1 2 6
2 2 6
3 2 6
1 3 7
2 3 7
3 3 7
1 2 7
2 2 7
3 2 7
我基于(我相信)Knuth的一本TAOCP書實現了上面的算法(在評論@chikitin中有更具體的參考:它在Knuth,Addison Wesley著的