从ArrayList(或set)元素

时间:2017-07-17 16:33:30

标签: java

我有一个班级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

我不关心检索组合的顺序,重要的是以最快的方式获取所有组合。

1 个答案:

答案 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才能使用它。