package com.shekhargulati.ninetynine_problems._01_lists;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
/**
* (**) Generate the combinations of K distinct objects chosen from the N elements of a list
*/
public class P26 {
public static <T> List<List<T>> combinations(List<T> list, int k) {
if (k == 0 || list.isEmpty()) {
return Collections.emptyList();
}
if (k == 1) {
return list.stream().map(e -> Stream.of(e).collect(toList())).collect(toList());
}
Map<Boolean, List<T>> headAndTail = P17.split(list, 1);
List<T> head = headAndTail.get(true);
List<T> tail = headAndTail.get(false);
List<List<T>> c1 = combinations(tail, (k - 1)).stream().map(e -> {
List<T> l = new ArrayList<>();
l.addAll(head);
l.addAll(e);
return l;
}).collect(Collectors.toList());
List<List<T>> c2 = combinations(tail, k);
c1.addAll(c2);
return c1;
}
}