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