import com.google.common.collect.ImmutableMap; /** * Coding Dojo Session * Given a positive integer number (eg 42) determine its Roman numeral representation as a String (eg "XLII"). * http://cyber-dojo.org/setup/show/ * Date: 22/07/2015 **/ public class RomanNumeral { private static final String I = "I"; private static final String V = "V"; private static final String X = "X"; private static final String L = "L"; private static final String C = "C"; private static final String D = "D"; private static final ImmutableMap<Integer, String> ARABIC_TO_ROMAN = arabicToRomans(); private static ImmutableMap<Integer, String> arabicToRomans() { return ImmutableMap.<Integer, String>builder().put(1, I).put(5, V).put(10, X).put(50, L).put(100, C).put(500, D).build(); } public static String convertNumber(int number) { if (ARABIC_TO_ROMAN.containsKey(number)) { return ARABIC_TO_ROMAN.get(number); } if (number < 40) { return getLetters(number / 10, X) + convertFrom1to9(number % 10, 1, 5, 10); } else { return getLetters(number / 100, C) + convertFrom1to9(number % 100, 10, 50, 100); } } private static String convertFrom1to9(int number, int unit, int middle, int top) { String result; if (number < (middle - unit)) { result = getLetters(number, ARABIC_TO_ROMAN.get(unit)); } else if (number == (middle - unit)) { result = ARABIC_TO_ROMAN.get(unit) + ARABIC_TO_ROMAN.get(middle); } else if (number == (top - unit)) { result = ARABIC_TO_ROMAN.get(unit) + ARABIC_TO_ROMAN.get(top); } else { result = ARABIC_TO_ROMAN.get(middle) + getLetters(number - middle, ARABIC_TO_ROMAN.get(unit)); } return result; } public static String getLetters(int num, String letter) { String ones = ""; while (num-- > 0) ones += letter; return ones; } }