我有一个班级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;
}
}
一个类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
我不关心检索组合的顺序,重要的是以最快的方式获取所有组合。
答案 0 :(得分: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
p1 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
才能使用它。