Java examples for Data Structure:Algorithm
Make all combinations of N size of objects
/*/*w ww .ja va2 s . c om*/ * Copyright (c) 2012 The Broad Institute * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //package com.java2s; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { /** * Make all combinations of N size of objects * * if objects = [A, B, C] * if N = 1 => [[A], [B], [C]] * if N = 2 => [[A, A], [B, A], [C, A], [A, B], [B, B], [C, B], [A, C], [B, C], [C, C]] * * @param objects * @param n * @param <T> * @param withReplacement if false, the resulting permutations will only contain unique objects from objects * @return */ public static <T> List<List<T>> makePermutations(final List<T> objects, final int n, final boolean withReplacement) { final List<List<T>> combinations = new ArrayList<List<T>>(); if (n <= 0) ; else if (n == 1) { for (final T o : objects) combinations.add(Collections.singletonList(o)); } else { final List<List<T>> sub = makePermutations(objects, n - 1, withReplacement); for (List<T> subI : sub) { for (final T a : objects) { if (withReplacement || !subI.contains(a)) combinations.add(cons(a, subI)); } } } return combinations; } public static <T> List<T> cons(final T elt, final List<T> l) { List<T> l2 = new ArrayList<T>(); l2.add(elt); if (l != null) l2.addAll(l); return l2; } }