All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hfg.math.Permutations Maven / Gradle / Ivy

There is a newer version: 20240423
Show newest version
package com.hfg.math;


import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

import com.hfg.util.collection.CollectionUtil;

//------------------------------------------------------------------------------
/**
 Utility functions for creating permutations.
 Permutations are for lists (order matters) and combinations are for groups (order doesn’t matter).
 
@author J. Alex Taylor, hairyfatguy.com
*/ //------------------------------------------------------------------------------ // com.hfg Library // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com // [email protected] //------------------------------------------------------------------------------ public class Permutations { //--------------------------------------------------------------------------- public static List permutationsWithRepetition(List inObjects, int inPermutationSize) { List combinations = null; if (CollectionUtil.hasValues(inObjects)) { if (inPermutationSize == 1) { // Special case if permutation size is 1 combinations = new ArrayList<>(inObjects.size()); for (T obj : inObjects) { T[] combination = (T[]) Array.newInstance(inObjects.get(0).getClass(), inPermutationSize); combination[0] = obj; combinations.add(combination); } } else { int numCombinations = (int) Math.pow(inObjects.size(), inPermutationSize); combinations = new ArrayList<>(numCombinations); innerPermutationsWithRepetition(inObjects, (T[]) Array.newInstance(inObjects.get(0).getClass(), inPermutationSize), 0, combinations); } } return combinations; } //--------------------------------------------------------------------------- private static void innerPermutationsWithRepetition(List inObjects, T[] inArray, int inCurrentIndex, List inPermutations) { if (inCurrentIndex < inArray.length) { for (int i = 0; i < inObjects.size(); i++) { T[] oldArray = inArray.clone(); inArray[inCurrentIndex] = inObjects.get(i); innerPermutationsWithRepetition(inObjects, inArray, inCurrentIndex + 1, inPermutations); inArray = oldArray; } } else { inPermutations.add(inArray); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy