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; } }