private List<List<Long>> finalSet = new LinkedList<List<Long>>(); //絎涘崱灝旂Н
private List<List<Long>> newStates = new LinkedList<List<Long>>(); //鐘舵侀泦鍚堬紝琚敤鏉ヨ綆楃瑳鍗″皵縐殑涓棿鐘舵?/span>
private boolean abort = false; //閬囩┖緇堟
public final Descartes compute(List<Long> inputSet) {
if (abort) {
return this;
}
//絀洪泦闃插盡
if (inputSet == null || inputSet.size() == 0) {
finalSet = new LinkedList<List<Long>>();//絀洪泦
abort = true;
return this;
}
if (finalSet.size() == 0) {//濡傛灉finalSet涓虹┖錛屽垯鎶婅緭鍏ョ殑闆嗗悎褰撳仛finalSet
for (Long element : inputSet) {
List<Long> set = new LinkedList<Long>();
set.add(element);
finalSet.add(set);
}
} else {
for (List<Long> originalSet : finalSet) {
for (Long set : inputSet) {
List<Long> newState = new LinkedList<Long>();
newState.addAll(originalSet); //鎶婂垵濮嬩腑鐨勬瘡涓泦鍚堟嬁鍑烘潵鍜岃緭鍏ョ殑闆嗗悎鐨勬瘡涓厓绱犵粍鍚堟垚涓涓柊鐨勯泦鍚?/span>
newState.add(set);
newStates.add(newState);
}
}
if (newStates.size() > 0) {
finalSet = newStates;
newStates = new LinkedList<List<Long>>();
}
}
return this;
}
public final List<List<Long>> getResult() {
return finalSet;
}
}