如何 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.

中,则为真

你的算法存在三个问题:

  1. 您正在重新洗牌并一次又一次地添加相同的列表。尝试在循环中的某处添加 x = new ArrayList(x)
  2. 正如 Manos 所指出的,您必须使用 contains,而不是 containsAll;否则,您将检查是否包含新打乱的数组列表 内部 中的所有元素,但事实并非如此,因此您将再次添加相同的列表。
  3. 你的算法太慢了。一旦解决了上述两个问题,算法就可以正常工作,得到 最后一个 排列的概率将是 1/n! (对于 n 个元素),所以这将花费非常非常长的时间。