Omzetten tussen Romeinse en Arabische cijfers in Java

1. Inleiding

De oude Romeinen ontwikkelden hun eigen numerieke systeem, Romeinse cijfers genaamd. Het systeem gebruikt letters met verschillende waarden om getallen weer te geven. Romeinse cijfers worden nog steeds gebruikt in enkele kleine toepassingen.

In deze tutorial zullen we implementeren eenvoudige converters die getallen van het ene systeem naar het andere zullen transformeren.

2. Romeinse cijfers

In het Romeinse systeem hebben we 7 symbolen die cijfers vertegenwoordigen:

  • ik vertegenwoordigt 1
  • V. vertegenwoordigt 5
  • X vertegenwoordigt 10
  • L. vertegenwoordigt 50
  • C staat voor 100
  • D vertegenwoordigt 500
  • M. vertegenwoordigt 1000

Oorspronkelijk vertegenwoordigden mensen een 4 met IIII of 40 met XXXX. Dit kan nogal ongemakkelijk zijn om te lezen. Het is ook gemakkelijk om vier symbolen naast elkaar te verwarren met drie symbolen.

Romeinse cijfers gebruiken subtractieve notatie om dergelijke fouten te vermijden. Inplaats van zeggen vier keer één (IIII), kan men zeggen dat het zo is één minder dan vijf (IV).

Hoe is het belangrijk vanuit ons perspectief? Het is belangrijk omdat we in plaats van simpelweg getallen symbool voor symbool toe te voegen, mogelijk het volgende symbool moeten controleren om te bepalen of het getal moet worden opgeteld of afgetrokken.

3. Model

Laten we een opsomming definiëren om de Romeinse cijfers weer te geven:

opsomming RomanNumeral {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); private int waarde; RomanNumeral (int waarde) {this.value = waarde; } public int getValue () {retourwaarde; } openbare statische lijst getReverseSortedValues ​​() {retourneer Arrays.stream (waarden ()) .sorted (Comparator.comparing ((RomanNumeral e) -> e.value) .reversed ()) .collect (Collectors.toList ()); }}

Merk op dat we aanvullende symbolen hebben gedefinieerd om te helpen met subtractieve notatie. We hebben ook een extra methode gedefinieerd met de naam getReverseSortedValues ​​().

Met deze methode kunnen we de gedefinieerde Romeinse cijfers expliciet ophalen in aflopende volgorde van waarden.

4. Romeins naar Arabisch

Romeinse cijfers kunnen alleen gehele getallen tussen 1 en 4000 vertegenwoordigen. We kunnen het volgende algoritme gebruiken om een ​​Romeins cijfer naar een Arabisch getal te converteren (symbolen doorlopen in omgekeerde volgorde van M. naar ik):

LAAT het cijfer de invoertekenreeks zijn die een Romeins cijfer vertegenwoordigt. LAAT het symbool in eerste instantie worden ingesteld op RomanNumeral.values ​​() [0] TERWIJL numeral.length> 0: ALS het cijfer begint met de naam van het symbool: voeg de waarde van het symbool toe aan het resultaat, verwijder de naam van het symbool uit de begin van het cijfer ELSE: zet het symbool op het volgende symbool

4.1. Implementatie

Vervolgens kunnen we het algoritme in Java implementeren:

openbare statische int romanToArabic (String-invoer) {String romanNumeral = input.toUpperCase (); int resultaat = 0; Lijst romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0; while ((romanNumeral.length ()> 0) && (i 0) {throw new IllegalArgumentException (input + "kan niet worden geconverteerd naar een Roman Numeral");} return resultaat;}

4.2. Test

Ten slotte kunnen we de implementatie testen:

@Test openbare ongeldig gegeven2018Roman_WhenConvertingToArabic_ThenReturn2018 () {String roman2018 = "MMXVIII"; int resultaat = RomanArabicConverter.romanToArabic (roman2018); assertThat (resultaat) .isEqualTo (2018); }

5. Arabisch naar Romeins

We kunnen het volgende algoritme gebruiken om van Arabische naar Romeinse cijfers te converteren (door symbolen in omgekeerde volgorde te herhalen van M. naar ik):

LAAT-nummer een geheel getal zijn tussen 1 en 4000 LAAT-symbool zijn RomanNumeral.values ​​() [0] LAAT-resultaat een lege tekenreeks zijn WHILE-nummer> 0: IF-waarde van symbool <= nummer: voeg het resultaat toe met de naam van het symbool trek de waarde van het symbool af van het nummer ANDERS: kies het volgende symbool

5.1. Implementatie

Vervolgens kunnen we het algoritme nu implementeren:

public static String arabicToRoman (int number) {if ((number 4000)) {throw new IllegalArgumentException (number + "is not in range (0,4000]");} List romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0 ; StringBuilder sb = new StringBuilder (); while ((number> 0) && (i <romanNumerals.size ())) {RomanNumeral currentSymbol = romanNumerals.get (i); if (currentSymbol.getValue () <= nummer) { sb.append (currentSymbol.name ()); nummer - = currentSymbol.getValue ();} anders {i ++;}} retourneer sb.toString ();}

5.2. Test

Ten slotte kunnen we de implementatie testen:

@Test openbare leegte gegeven1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX () {int arabic1999 = 1999; String resultaat = RomanArabicConverter.arabicToRoman (arabic1999); assertThat (resultaat) .isEqualTo ("MCMXCIX"); }

6. Conclusie

In dit korte artikel hebben we laten zien hoe u tussen Romeinse en Arabische cijfers kunt converteren.

We hebben een opsomming om de reeks Romeinse cijfers weer te geven en we hebben een hulpprogramma-klasse gemaakt om de conversies uit te voeren.

De volledige implementatie en alle tests zijn te vinden op GitHub.