package com.taobao.tddl.optimizer.utils; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * 用来生成一个序列的全排列 非递归 * * @author Dreamond */ public final class PermutationGenerator { private List elements; private Stack<List> currentState = new Stack(); private Stack<Integer> currentUsedStack = new Stack(); private List permutation = new ArrayList(); public PermutationGenerator(List elements){ this.elements = elements; this.reset(); } public void reset() { this.currentState.clear(); List rest = new ArrayList(elements); currentState.push(rest); currentUsedStack.push(-1); } public List next() { boolean flag = true; while (permutation.size() < this.elements.size() || flag) { flag = false; List<?> rest = new ArrayList(currentState.peek()); Integer currentUsed = currentUsedStack.peek(); if (currentUsed != rest.size() - 1) { if (!permutation.isEmpty() && currentUsed > -1 && permutation.get(permutation.size() - 1).equals(rest.get(currentUsed))) { permutation.remove(permutation.size() - 1); } else { currentUsed++; permutation.add(rest.get(currentUsed)); rest.remove((int) currentUsed); currentState.push(rest); currentUsedStack.pop(); currentUsedStack.push(currentUsed); currentUsedStack.push(-1); } } else { this.currentState.pop(); currentUsedStack.pop(); permutation.remove(permutation.size() - 1); flag = true; } } return new ArrayList(permutation); } public boolean hasNext() { if (elements.size() != this.permutation.size()) { return true; } for (int i = 0; i < this.elements.size(); i++) { if (!elements.get(i).equals(this.permutation.get(this.permutation.size() - 1 - i))) { return true; } } return false; } }