Skip to content

Commit b1d194c

Browse files
eric-martinpivovarit
authored andcommitted
BAEL-1815: RomanNumeral and RomanArabicConverter (eugenp#4565)
* BAEL-1815: RomanNumeral and RomanArabicConverter * Refactored getReverseSortedValues
1 parent e065d94 commit b1d194c

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.baeldung.algorithms.romannumerals;
2+
3+
import java.util.List;
4+
5+
class RomanArabicConverter {
6+
7+
public static int romanToArabic(String input) {
8+
String romanNumeral = input.toUpperCase();
9+
int result = 0;
10+
11+
List<RomanNumeral> romanNumerals = RomanNumeral.getReverseSortedValues();
12+
13+
int i = 0;
14+
15+
while ((romanNumeral.length() > 0) && (i < romanNumerals.size())) {
16+
RomanNumeral symbol = romanNumerals.get(i);
17+
if (romanNumeral.startsWith(symbol.name())) {
18+
result += symbol.getValue();
19+
romanNumeral = romanNumeral.substring(symbol.name().length());
20+
} else {
21+
i++;
22+
}
23+
}
24+
if (romanNumeral.length() > 0) {
25+
throw new IllegalArgumentException(input + " cannot be converted to a Roman Numeral");
26+
}
27+
28+
return result;
29+
}
30+
31+
public static String arabicToRoman(int number) {
32+
if ((number <= 0) || (number > 4000)) {
33+
throw new IllegalArgumentException(number + " is not in range (0,4000]");
34+
}
35+
36+
List<RomanNumeral> romanNumerals = RomanNumeral.getReverseSortedValues();
37+
38+
int i = 0;
39+
StringBuilder sb = new StringBuilder();
40+
41+
while (number > 0 && i < romanNumerals.size()) {
42+
RomanNumeral currentSymbol = romanNumerals.get(i);
43+
if (currentSymbol.getValue() <= number) {
44+
sb.append(currentSymbol.name());
45+
number -= currentSymbol.getValue();
46+
} else {
47+
i++;
48+
}
49+
}
50+
return sb.toString();
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.algorithms.romannumerals;
2+
3+
import java.util.Arrays;
4+
import java.util.Comparator;
5+
import java.util.List;
6+
import java.util.stream.Collectors;
7+
8+
enum RomanNumeral {
9+
I(1), IV(4), V(5), IX(9), X(10), XL(40), L(50), XC(90), C(100), CD(400), D(500), CM(900), M(1000);
10+
11+
private int value;
12+
13+
RomanNumeral(int value) {
14+
this.value = value;
15+
}
16+
17+
public int getValue() {
18+
return value;
19+
}
20+
21+
public static List<RomanNumeral> getReverseSortedValues() {
22+
return Arrays.stream(values())
23+
.sorted(Comparator.comparing((RomanNumeral e) -> e.value).reversed())
24+
.collect(Collectors.toList());
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.baeldung.algorithms.romannumerals;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.Test;
6+
7+
public class RomanArabicConverterUnitTest {
8+
9+
@Test
10+
public void given2018Roman_WhenConvertingToArabic_ThenReturn2018() {
11+
12+
String roman2018 = "MMXVIII";
13+
14+
int result = RomanArabicConverter.romanToArabic(roman2018);
15+
16+
assertThat(result).isEqualTo(2018);
17+
}
18+
19+
@Test
20+
public void given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX() {
21+
22+
int arabic1999 = 1999;
23+
24+
String result = RomanArabicConverter.arabicToRoman(arabic1999);
25+
26+
assertThat(result).isEqualTo("MCMXCIX");
27+
}
28+
29+
}

0 commit comments

Comments
 (0)