1 package diffblue.roman; 2 3 import java.util.Map; 4 import java.util.function.ToIntFunction; 5 import java.util.regex.MatchResult; 6 import java.util.regex.Pattern; 7 8 9 public final class RomanToArabicConverter implements ToIntFunction<String> { 10 private static final Map<String, Integer> ROMAN_TO_ARABIC = Map.ofEntries( 11 Map.entry("CM", 900), 12 Map.entry("M", 1000), 13 Map.entry("CD", 400), 14 Map.entry("D", 500), 15 Map.entry("XC", 90), 16 Map.entry("C", 100), 17 Map.entry("XL", 40), 18 Map.entry("L", 50), 19 Map.entry("IX", 9), 20 Map.entry("X", 10), 21 Map.entry("IV", 4), 22 Map.entry("V", 5), 23 Map.entry("I", 1) 24 ); 25 private static final Pattern TOKEN_PATTERN = Pattern.compile("C?M|C?D|X?C|X?L|I?X|I?V|I"); 26 27 @Override 28 public int applyAsInt(String value) { 29 return TOKEN_PATTERN.matcher(value).results() 30 .map(MatchResult::group) 31 .mapToInt(ROMAN_TO_ARABIC::get) 32 .sum(); 33 } 34 }