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 }