Java tutorial
//package com.java2s; /* ======================================================================== * PlantUML : a free UML diagram generator * ======================================================================== * * (C) Copyright 2009-2017, Arnaud Roques * * Project Info: http://plantuml.com * * This file is part of PlantUML. * * PlantUML is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PlantUML distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * * Original Author: Arnaud Roques * * */ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; public class Main { public static <E> Collection<List<E>> selectExactly(List<E> original, int nb) { if (nb < 0) { throw new IllegalArgumentException(); } if (nb == 0) { return Collections.emptyList(); } if (nb == 1) { final List<List<E>> result = new ArrayList<List<E>>(); for (E element : original) { result.add(Collections.singletonList(element)); } return result; } if (nb > original.size()) { return Collections.emptyList(); } if (nb == original.size()) { return Collections.singletonList(original); } final List<List<E>> result = new ArrayList<List<E>>(); for (List<E> subList : selectExactly(original.subList(1, original.size()), nb - 1)) { final List<E> newList = new ArrayList<E>(); newList.add(original.get(0)); newList.addAll(subList); result.add(Collections.unmodifiableList(newList)); } result.addAll(selectExactly(original.subList(1, original.size()), nb)); return Collections.unmodifiableList(result); } }