如何返回字符串ArrayList的所有排列

时间:2015-09-07 18:29:59

标签: java arraylist permute

我正在尝试编写一个返回一个大ArrayList<ArrayList<String>>的方法,该方法包含较小的ArrayLists,每个ArrayLists都有一个不同的起始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包含相同的ArrayLists,即使我有一个if语句,这是特定的,所以不会发生。

我错过了什么?

2 个答案:

答案 0 :(得分:6)

您的算法存在三个问题:

  1. 您正在重新洗牌并一次又一次地添加相同的列表。尝试在循环中的某处添加x = new ArrayList(x)
  2. 正如马诺斯所指出的,你必须使用contains,而不是containsAll;否则你要检查是否包含里面的新洗牌数组列表中的所有元素,这种情况绝对不会发生,因此你再次添加相同的列表。
  3. 你的算法非常可怕,速度非常慢。一旦你解决了上述两个问题,那么算法就可以完成工作,获得最后排列的概率将为1/n!(对于n元素),所以这将花费非常非常长的时间。

答案 1 :(得分:0)

res.containsAll(x)

如果String中存在x中res类型的所有元素,则会出现这种情况。但res的元素是ArrayList<String>。你可能想要:

res.contains(x)

如果在{res。

中存在ArrayList<String>的x,则为真