Java 如何返回字符串数组列表的所有排列
我试图编写一个方法,返回一个大的Java 如何返回字符串数组列表的所有排列,java,arraylist,permute,Java,Arraylist,Permute,我试图编写一个方法,返回一个大的ArrayList,其中包含较小的ArrayList,每个ArrayList都有一个不同的起始ArrayList排列 这是我的方法: public static ArrayList<ArrayList<String>> permute(ArrayList<String> x) { ArrayList<ArrayList<String>> res = new ArrayList<ArrayL
ArrayList
,其中包含较小的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排列(ArrayList x){
ArrayList res=新的ArrayList();
而(res.size()
我的方法基本上是继续重新排列原始的ArrayList x,并检查它是否已经在结果ArrayList中,如果没有,则添加它。出于某种原因,当我尝试此方法时,结果ArrayList包含相同的ArrayList,即使我有一个if语句,该语句专门用于防止这种情况发生
我遗漏了什么?res.containsAll(x)
如果x中的String
类型的所有元素都存在于res
中,则为真。但是res
的元素是ArrayList
。您可能想要:
res.contains(x)
如果在res.res.containsAll(x)
如果x中的String
类型的所有元素都存在于res
中,则为真。但是res
的元素是ArrayList
。您可能想要:
res.contains(x)
如果x是一个
ArrayList
存在于res中,则这是正确的。您的算法有三个问题:
x=newarraylist(x)
contains
,而不是containsAll
;否则,您将检查是否包含新洗牌数组列表中的所有元素,但情况并非如此,因此您将再次添加相同的列表1/n代码>(对于n
元素),所以这需要非常非常长的时间
您的算法有三个问题:
x=newarraylist(x)
contains
,而不是containsAll
;否则,您将检查是否包含新洗牌数组列表中的所有元素,但情况并非如此,因此您将再次添加相同的列表1/n代码>(对于n
元素),所以这需要非常非常长的时间
有比洗牌更好的方法来计算排列,因为这对您的性能非常不利。此外,res是ArrayList的列表,而x是字符串的列表,因此您无法将它们与包含的所有内容进行比较。您可以获得更有效解决方案的提示,并且有比shuffle更好的方法计算置换,因为这对您的性能非常不利。此外,res是一个ArrayList列表,而x是一个字符串列表,因此您无法将它们与contains all进行比较。您可以得到更有效解决方案的提示,我尝试了这一点。它只是在一个无限循环中进行,因为由于某种原因,while循环条件从未达到。Res的大小始终为1,但内部的ArrayList一直在更改。@Swailem95这是因为您一直在洗牌相同的集合。你需要创建一个新的集合并将其洗牌。我试过了。它只是在一个无限循环中进行,因为由于某种原因,while循环条件从未达到。Res的大小始终为1,但内部的ArrayList一直在更改。@Swailem95这是因为您一直在洗牌相同的集合。你需要创建一个新的集合并将其洗牌。我理解n!,但为什么是1/n@Swailem95,因为您正在滚动随机数。一旦你得到了除一个以外的所有
n代码>排列,从总数n中得到最后一个的概率可能出现的代码>是1/n代码>我理解n!,但为什么是1/n@Swailem95,因为您正在滚动随机数。一旦你得到了除一个以外的所有n代码>排列,从总数n中得到最后一个的概率可能出现的代码>是1/n代码>