如何 return 字符串 ArrayList 的所有排列
How to return all permutations of an ArrayList of Strings
我正在尝试编写一种方法,其中 returns 一个大的 ArrayList<ArrayList<String>>
包含较小的 ArrayList,每个 ArrayList 都有不同的起始 ArrayList 排列。
这是我的方法:
public static ArrayList<ArrayList<String>> permute(ArrayList<String> x) {
ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();
while (res.size() < fac(x.size())) { //fac method works fine
Collections.shuffle(x);
if (!res.containsAll(x)) {
res.add(x);
}
}
return res;
}
我的方法基本上是不断重新排列原始ArrayList x,并检查它是否已经在结果ArrayList 中,如果不是,那么我添加它。出于某种原因,当我尝试此方法时,生成的 ArrayList 包含相同的 ArrayList,即使我有一个 if 语句,该语句专门存在,因此不会发生。
我错过了什么?
res.containsAll(x)
如果 x 中类型为 String
的所有元素都存在于 res
中,则为真。但是 res
的元素是 ArrayList<String>
。你可能想要:
res.contains(x)
如果 ArrayList<String>
中的 x 存在于 res.
中,则为真
你的算法存在三个问题:
- 您正在重新洗牌并一次又一次地添加相同的列表。尝试在循环中的某处添加
x = new ArrayList(x)
。
- 正如 Manos 所指出的,您必须使用
contains
,而不是 containsAll
;否则,您将检查是否包含新打乱的数组列表 内部 中的所有元素,但事实并非如此,因此您将再次添加相同的列表。
- 你的算法太慢了。一旦解决了上述两个问题,算法就可以正常工作,得到 最后一个 排列的概率将是
1/n!
(对于 n
个元素),所以这将花费非常非常长的时间。
我正在尝试编写一种方法,其中 returns 一个大的 ArrayList<ArrayList<String>>
包含较小的 ArrayList,每个 ArrayList 都有不同的起始 ArrayList 排列。
这是我的方法:
public static ArrayList<ArrayList<String>> permute(ArrayList<String> x) {
ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();
while (res.size() < fac(x.size())) { //fac method works fine
Collections.shuffle(x);
if (!res.containsAll(x)) {
res.add(x);
}
}
return res;
}
我的方法基本上是不断重新排列原始ArrayList x,并检查它是否已经在结果ArrayList 中,如果不是,那么我添加它。出于某种原因,当我尝试此方法时,生成的 ArrayList 包含相同的 ArrayList,即使我有一个 if 语句,该语句专门存在,因此不会发生。
我错过了什么?
res.containsAll(x)
如果 x 中类型为 String
的所有元素都存在于 res
中,则为真。但是 res
的元素是 ArrayList<String>
。你可能想要:
res.contains(x)
如果 ArrayList<String>
中的 x 存在于 res.
你的算法存在三个问题:
- 您正在重新洗牌并一次又一次地添加相同的列表。尝试在循环中的某处添加
x = new ArrayList(x)
。 - 正如 Manos 所指出的,您必须使用
contains
,而不是containsAll
;否则,您将检查是否包含新打乱的数组列表 内部 中的所有元素,但事实并非如此,因此您将再次添加相同的列表。 - 你的算法太慢了。一旦解决了上述两个问题,算法就可以正常工作,得到 最后一个 排列的概率将是
1/n!
(对于n
个元素),所以这将花费非常非常长的时间。