package com.milaboratory.util; import cc.redberry.pipe.OutputPort; /** * @author Dmitry Bolotin * @author Stanislav Poslavsky */ public final class IntCombinations implements OutputPort<int[]> { final int[] combination; private final int n, k; private boolean onFirst = true; public IntCombinations(int n, int k) { if (n < k) throw new IllegalArgumentException(" n < k "); this.n = n; this.k = k; this.combination = new int[k]; reset(); } public void reset() { onFirst = true; for (int i = 0; i < k; ++i) combination[i] = i; } private boolean isLast() { for (int i = 0; i < k; ++i) if (combination[i] != i + n - k) return false; return true; } @Override public int[] take() { if (onFirst) onFirst = false; else { if (isLast()) return null; int i; for (i = k - 1; i >= 0; --i) if (combination[i] != i + n - k) break; int m = ++combination[i++]; for (; i < k; ++i) combination[i] = ++m; } return combination; } }