簡體   English   中英

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

[英]How to return all permutations of an ArrayList of Strings

我正在嘗試編寫一種方法,該方法返回一個大的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,並檢查它是否已經在結果ArrayList中,如果不是,則添加它。 出於某種原因,當我嘗試使用此方法時,即使我有一個if語句,結果數組列表也包含相同的ArrayList,因此不會發生。

我想念什么?

您的算法存在三個問題:

  1. 您正在重新組合,並一次又一次地添加相同的列表。 嘗試在循環中的某處添加x = new ArrayList(x)
  2. 正如Manos所指出的,您必須使用contains ,而不是containsAll ;。 否則,你正在檢查所有新洗牌數組列表的元素是否包含,這是從來沒有的情況下,所以你再次添加相同的列表。
  3. 您的算法非常可怕,非常緩慢。 一旦解決了上述兩個問題,算法就可以工作了,獲得最后一個排列的概率將是1/n! (用於n元素),因此這將花費非常長的時間。

res.containsAll(x)

如果x中所有String類型的元素都存在於res則將為true。 但是res的元素是ArrayList<String> 您可能想要:

res.contains(x)

如果res內存在x(它是ArrayList<String> ,則為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM