1 /* 2 * VariatorWithRepetition.java 3 * 4 * Created on 7-mrt-2006 5 * 6 * Copyright (C) 2006 Hendrik Maryns <hendrik@sfs.uni-tuebingen.de>. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 2 11 * of the License, or (at your option) any later version. 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 */ 20 package combinatorics; 21 22 import java.util.Arrays; 23 24 /** 25 * A class that sequentially returns all variations with repetition of a certain 26 * number out of an array of given elements. 27 * 28 * @author <a href="mailto:hendrik.maryns@uni-tuebingen.de">Hendrik Maryns</a> 29 * @param <T> The type of the elements of which variations are to be 30 * returned. 31 */ 32 public final class VariatorWithRepetition<T> extends CombinatoricOperator<T> { 33 34 /** 35 * Initialise a new variator, with given elements and size of the arrays 36 * to be returned. 37 * 38 * @param elements 39 * The elements of which variations have to be computed. 40 * @param r 41 * The size of the variations to compute. 42 * @pre r should not be smaller than 0. 43 * | 0 <= r 44 * @post The total number of iterations is set to the number of elements 45 * to the rth power. 46 * | new.getTotal() == BigInteger.valueOf(elements.length).pow(r) 47 * @post The number of variations left is set to the total number. 48 * | new.getNumLeft() == new.getTotal() 49 */ 50 public VariatorWithRepetition(final T[] elements, final int r) { 51 super(elements, r); 52 } 53 54 /** 55 * Initialise the array of indices. For variations with repetition, it 56 * needs to be initialised with all 0s. 57 */ 58 @Override 59 protected void initialiseIndices() { 60 Arrays.fill(this.indices, 0); 61 } 62 63 /** 64 * Compute the total number of elements to return. 65 * 66 * @see CombinatoricOperator#initialiseTotal() 67 */ 68 @Override 69 protected double initialiseTotal(final int n, final int r) { 70 return Math.pow(n, r); 71 } 72 73 /** 74 * Compute the next array of indices. 75 * 76 * @see CombinatoricOperator#computeNext() 77 */ 78 @Override 79 protected void computeNext() { 80 int i = this.indices.length - 1; 81 final int n = this.elements.length; 82 while (++this.indices[i] == n && i > 0) { 83 this.indices[i--] = 0; 84 } 85 } 86 87 }