2017-07-17 53 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才能使用它。