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

de.invation.code.toval.math.CombinationsCalculator Maven / Gradle / Ivy

package de.invation.code.toval.math;

import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;

import de.invation.code.toval.misc.ArrayUtils;
import de.invation.code.toval.validate.Validate;

public class CombinationsCalculator implements Iterator{
	
	private Object[] originalArray = null;
	private int combinationLength = 0;
	private long numCombinations = 0;
	private long calculatedCombinations = 0;
	
	private int[] lastIndexCombination = null;
	
	@SuppressWarnings("unchecked")
	public CombinationsCalculator(List originalList, int combinationLength){
		this((T[]) originalList.toArray(), combinationLength);
	}
	
	public CombinationsCalculator(T[] originalArray, int combinationLength){
		Validate.notNull(originalArray);
		Validate.bigger(originalArray.length, 0);
		Validate.bigger(combinationLength, 0);
		Validate.isTrue(combinationLength <= originalArray.length);
		
		this.originalArray = originalArray;
		this.combinationLength = combinationLength;
		numCombinations = MathUtils.binCoeff(originalArray.length, combinationLength);
		lastIndexCombination = ArrayUtils.createAndInitializeArray(combinationLength, 0);
	}

	@Override
	public boolean hasNext() {
		return calculatedCombinations < numCombinations;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T[] next() {
		if (!hasNext()) {
            throw new NoSuchElementException();
        }
		
        Object[] result = new Object[combinationLength];
        for (int i = 0; i < combinationLength; i++) {
            result[i] = originalArray[lastIndexCombination[i]];
        }

        for (int i = combinationLength - 1; i >= 0; i--) {
            if (lastIndexCombination[i] < originalArray.length - combinationLength + i) {
                lastIndexCombination[i]++;
                for (int j = i + 1; j < combinationLength; j++) {
                    lastIndexCombination[j] = lastIndexCombination[i] - i + j;
                }
                break;
            }
        }
        
        calculatedCombinations++;
        return (T[]) result;
	}

	@Override
	public void remove() {}

//	public static void main(String[] args) {
//		List arr = ListUtils.createAndInitializeList(100, new Integer(1));
//		System.out.println(arr);
//		CombinationsCalculator calc = new CombinationsCalculator(arr, 2);
//		long start = System.currentTimeMillis();
//		while(calc.hasNext()){
//			calc.next();
//		}
//		TimeValue time = new TimeValue(System.currentTimeMillis() - start, TimeScale.MILLISECONDS);
//		time.adjustScale();
//		System.out.println(time);
//	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy