View Javadoc
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  }