Iterative Cartesian Product in Java

前端 未结 9 1873
既然无缘
既然无缘 2020-11-27 07:00

I want to compute the cartesian product of an arbitrary number of nonempty sets in Java.

I\'ve wrote that iterative code...

public s         


        
9条回答
  •  离开以前
    2020-11-27 07:24

    I believe this is correct. It is not seeking efficiency, but a clean style through recursion and abstraction.

    The key abstraction is to introduce a simple Tuple class. This helps the generics later:

    class Tuple {
        private List list = new ArrayList();
    
        public void add(T t) { list.add(t); }
    
        public void addAll(Tuple subT) {
            for (T t : subT.list) {
                list.add(t);
            }
        }
    
        public String toString() {
            String result = "(";
    
            for (T t : list) { result += t + ", "; }
    
            result = result.substring(0, result.length() - 2);
            result += " )";
    
            return result;
        } 
    }
    

    With this class, we can write a class like so:

    public class Example {
    
    public static  List> cartesianProduct(List> sets) {
        List> tuples = new ArrayList>();
    
        if (sets.size() == 1) {
            Set set = sets.get(0);
            for (T t : set) {
                Tuple tuple = new Tuple();
                tuple.add(t);    
                tuples.add(tuple);
            }
        } else {
            Set set = sets.remove(0);
            List> subTuples = cartesianProduct(sets);
            System.out.println("TRACER size = " + tuples.size());
            for (Tuple subTuple : subTuples) {
                for (T t : set) {
                    Tuple tuple = new Tuple();
                    tuple.addAll(subTuple);
                    tuple.add(t);
                    tuples.add(tuple);
                }
            }
        }
    
        return tuples;
    }
    

    }

    I have a decent example of this working, but it is omitted for brevity.

提交回复
热议问题