2017-07-17 70 views
-2

我有一個類Product其中產品具有名稱:獲取所有可能的組合(功率設置)(或設置)元素

package main; 

public class Product { 

    private String name; 

    public Product(String name) { 
     super(); 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

和A類Combination其中組合具有的一個數組列表產品:

package main; 

import java.util.ArrayList; 

public class Combination { 

    private ArrayList<Product> products; 

    public Combination(ArrayList<Product> products) { 
     super(); 
     this.products = products; 
    } 

    public ArrayList<Product> getProducts() { 
     return products; 
    } 

    public void setProducts(ArrayList<Product> products) { 
     this.products = products; 
    } 

} 

Main我創造琳琅滿目的商品清單,我想要得到的產品的所有可能的組合。

package main; 

import java.util.ArrayList; 

public class Main { 

    public static void main(String[] args) { 

     ArrayList<Product> products = new ArrayList<Product>(); 

     products.add(new Product("p1")); 
     products.add(new Product("p2")); 
     products.add(new Product("p3")); 
     products.add(new Product("p4")); 

     ArrayList<Combination> combinations = getCombinations(products); 

    } 

    public static ArrayList<Combination> getCombinations(ArrayList<Product> products){ 
     ArrayList<Combination> combinations = new ArrayList<Combination>(); 
     //CODE TO ADD 
     return combinations; 
    } 

} 

什麼是獲得所有組合的最快解決方案? 在所示的示例中,我將獲得以下的組合:

P1

P1,P2,

P1 P2 P3

P1 P2 P3 P4

P1,P2,P4

P1 p3

p1 p3 p4

P1 P4

P2

,P2,P3

P2 P3 P4

P2 P4

P3

P3 P4

p4

我不關心我檢索組合的順序,重要的是要以最快的方式獲取所有組合。

+3

你試過了什麼? – talex

+0

這可能會有幫助[計算給定字符的所有可能組合](https://codereview.stackexchange.com/questions/41510/calculate-all-possible-combinations-of-given-characters) – matoni

+0

請參閱此處的數組排列在SO: https://stackoverflow.com/questions/2920315/permutation-of-array – deHaar

回答

0

要獲得所有可能的組合,我用guava: google core libraries for java提供

首先PowerSet方法,我用一個Maven項目中,我的guava依賴添加到pom.xml

<dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>22.0</version> 
</dependency> 

然後我說的和getCombinations方法的內容我印刷結果在main方法:

package main; 

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Set; 

import com.google.common.collect.Sets; 

public class Main { 

    public static void main(String[] args) { 

     ArrayList<Product> products = new ArrayList<Product>(); 

     products.add(new Product("p1")); 
     products.add(new Product("p2")); 
     products.add(new Product("p3")); 
     products.add(new Product("p4")); 

     ArrayList<Combination> combinations = getCombinations(products); 

     for (Combination combination : combinations) { 
      for (Product product : combination.getProducts()) { 
       System.out.print(product.getName() + " "); 
      } 
      System.out.println(); 
     } 

    } 

    public static ArrayList<Combination> getCombinations(ArrayList<Product> products) { 
     ArrayList<Combination> combinations = new ArrayList<Combination>(); 
     Set<Product> productsSet = new HashSet<Product>(products); 
     Set<Set<Product>> combinationsSet = Sets.powerSet(productsSet); 
     Iterator<Set<Product>> combinationsIterator = combinationsSet.iterator(); 
     while (combinationsIterator.hasNext()) { 
      ArrayList<Product> productsList = new ArrayList<Product>(combinationsIterator.next()); 
      Combination combination = new Combination(productsList); 
      combinations.add(combination); 
     } 
     return combinations; 
    } 
} 

輸出:

P1

P4

P1 P4

P3

P1 P3

P4 P3

p 1個P4 P3

P2

P1,P2,

P4 P2

P1 P4 P2

P3 P2

P1 P3 P2

P4 P3 P2

p1 p4 p3 p2

由於我不關心訂單,所以我得到的結果很好。請注意,PowerSet方法適用於Sets,所以我必須將ArrayList轉換爲Set才能使用它。