import java.util.ArrayList; import java.util.List; public final class Combinations { public static void main(String[] args) { System.out.println(createCombinations(List.of( 0, 1, 2, 3, 4 ), 3)); System.out.println(createCombinations(List.of( "Crosby", "Nash", "Stills", "Young" ), 3)); } private static List> createCombinations(List elements, int k) { List> combinations = new ArrayList>(); createCombinations(elements, k, new ArrayList(), combinations, 0); return combinations; } private static void createCombinations( List elements, int k, List accumulator, List> combinations, int index) { if ( accumulator.size() == k ) { combinations.addFirst( new ArrayList(accumulator) ); } else if ( k - accumulator.size() <= elements.size() - index ) { createCombinations(elements, k, accumulator, combinations, index + 1); accumulator.add(elements.get(index)); createCombinations(elements, k, accumulator, combinations, index + 1); accumulator.removeLast(); } } }