Author: kmorin Date: 2014-01-06 11:55:34 +0100 (Mon, 06 Jan 2014) New Revision: 2614 Url: http://nuiton.org/projects/nuiton-utils/repository/revisions/2614 Log: fixes #2996 Add a method to divide an integer by another integer and returning an array of rounded quotients whose sum equals the divisor Added: trunk/src/main/java/org/nuiton/util/NumberUtil.java trunk/src/test/java/org/nuiton/util/NumberUtilTest.java Modified: trunk/pom.xml Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-12-12 15:03:49 UTC (rev 2613) +++ trunk/pom.xml 2014-01-06 10:55:34 UTC (rev 2614) @@ -109,6 +109,18 @@ </roles> </developer> + <developer> + <name>Kevin Morin</name> + <id>kmorin</id> + <email>morin at codelutin dot com</email> + <organization>CodeLutin</organization> + <organizationUrl>http://www.codelutin.com/</organizationUrl> + <timezone>Europe/Paris</timezone> + <roles> + <role>developer</role> + </roles> + </developer> + </developers> <scm> Added: trunk/src/main/java/org/nuiton/util/NumberUtil.java =================================================================== --- trunk/src/main/java/org/nuiton/util/NumberUtil.java (rev 0) +++ trunk/src/main/java/org/nuiton/util/NumberUtil.java 2014-01-06 10:55:34 UTC (rev 2614) @@ -0,0 +1,42 @@ +package org.nuiton.util; + +import java.util.Arrays; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 3.0 + */ +public class NumberUtil { + + /** + * Divide the divisor by the dividend. + * Returns an array containing the quotients rounded up or down + * to ensure the sum of the quotients equals the divisor. + * + * e.g. divideAndEnsureSum(100, 3) returns {34, 33, 33} + * + * @param divisor the divisor + * @param dividend the dividend + * @return an array whose length equals dividend + */ + public static int[] divideAndEnsureSum(int divisor, int dividend) { + // dividing by 0 is not permitted + if (dividend == 0) { + return null; + } + + int quotient = (int) ((double) divisor) / dividend; + int[] result = new int[dividend]; + Arrays.fill(result, quotient); + + int sum = quotient * dividend; + int i = 0; + while (sum != divisor && i < dividend) { + result[i]++; + sum++; + i++; + } + + return result; + } +} Added: trunk/src/test/java/org/nuiton/util/NumberUtilTest.java =================================================================== --- trunk/src/test/java/org/nuiton/util/NumberUtilTest.java (rev 0) +++ trunk/src/test/java/org/nuiton/util/NumberUtilTest.java 2014-01-06 10:55:34 UTC (rev 2614) @@ -0,0 +1,24 @@ +package org.nuiton.util; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author kmorin <kmorin@codelutin.com> + * @since 3.0 + */ +public class NumberUtilTest { + + private static final Log log = LogFactory.getLog(NumberUtilTest.class); + + @Test + public void testDivideAndEnsureSum() { + log.debug("test divideAndEnsureSum"); + Assert.assertNull(NumberUtil.divideAndEnsureSum(100, 0)); + Assert.assertArrayEquals(new int[]{ 34, 33, 33 }, NumberUtil.divideAndEnsureSum(100, 3)); + Assert.assertArrayEquals(new int[]{ 17, 17, 17, 17, 16, 16 }, NumberUtil.divideAndEnsureSum(100, 6)); + } + +}