Given a set {1,2,3,4,5...n}
of n elements, we need to find all subsets of length k .
For example, if n = 4 and k = 2, the output
would be
If you are looking for Iterator pattern answer then here you go.
public static Iterable> getList(final Iterable extends T> list) {
List> listOfList = new ArrayList<>();
for (T t: list)
listOfList.add(Collections.singletonList(t));
return listOfList;
}
public static Iterable> getIterable(final Iterable extends T> list, final int size) {
final List vals = new ArrayList<>();
int numElements = 0;
for (T t : list) {
vals.add(t);
numElements++;
}
if (size == 1) {
return getList(vals);
}
if (size == numElements) {
return Collections.singletonList(vals);
}
return new Iterable>() {
@Override
public Iterator> iterator() {
return new Iterator>() {
int currPos = 0;
Iterator> nextIterator = getIterable(
vals.subList(this.currPos + 1, vals.size()), size - 1).iterator();
@Override
public boolean hasNext() {
if ((this.currPos < vals.size()-2) && (this.currPos+size < vals.size()))
return true;
return false;
}
@Override
public List next() {
if (!nextIterator.hasNext()) {
this.currPos++;
nextIterator = getIterable(vals.subList(this.currPos+1, vals.size()), size-1).iterator();
}
final List ret = new ArrayList<>(nextIterator.next());
ret.add(0, vals.get(this.currPos));
return ret;
}
};
}
};
}