Római és arab számok konvertálása Java-ban

1. Bemutatkozás

Az ókori rómaiak kifejlesztették saját számrendszerüket, amelyeket római számoknak hívtak. A rendszer a számok ábrázolásához különböző értékű betűket használ. A római számokat ma is használják néhány kisebb alkalmazásban.

Ebben az oktatóanyagban megvalósítjuk egyszerű konverterek, amelyek átalakítják a számokat az egyik rendszerből a másikba.

2. Római számok

A római rendszerben van 7 szimbólum, amely számokat jelöl:

  • én jelentése 1
  • V jelentése 5
  • x 10-et jelent
  • L 50-et jelent
  • C 100-at jelent
  • D 500-at jelent
  • M 1000-et jelent

Eredetileg az emberek egy 4-et IIII-vel, vagy 40-et XXXX-szel jelöltek. Ezt elég kellemetlen lehet olvasni. Könnyen el lehet téveszteni egymás mellett négy szimbólumot három szimbólummal.

A római számok kivonó jelölést használnak hogy elkerülje az ilyen hibákat. Ahelyett, hogy mondaná négyszer egy (IIII), azt lehet mondani, hogy az eggyel kevesebb, mint öt (IV).

Mennyire fontos ez a mi szempontunkból? Fontos, mert ahelyett, hogy szimbólumról szimbólumra egészítenénk ki a számokat, előfordulhat, hogy ellenőriznünk kell a következő szimbólumot, hogy megállapítsuk, a számot hozzá kell-e adni vagy kivonni.

3. Modell

Határozzunk meg egy enumot a római számok képviseletére:

enum 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); privát int érték; RomanNumeral (int érték) {this.value = érték; } public int getValue () {return value; } public static List getReverseSortedValues ​​() {return Arrays.stream (values ​​()) .sorted (Comparator.comparing ((RomanNumeral e) -> e.value) .reversed ()) .collect (Collectors.toList ()); }}

Figyelje meg, hogy további szimbólumokat definiáltunk, amelyek segítenek a szubtraktív jelölésekben. Meghatároztunk egy további nevű módszert is getReverseSortedValues ​​().

Ez a módszer lehetővé teszi számunkra, hogy a meghatározott római számokat kifejezetten csökkenő sorrendben kapjuk meg.

4. római - arab

A római számok csak 1 és 4000 közötti egész számokat jelenthetnek. A következő algoritmust használhatjuk a római szám arab számgá alakítására (szimbólumokon keresztül fordítva, fordított sorrendben M nak nek én):

A LET szám legyen a bemeneti karakterlánc, amely római számot képvisel. A LET szimbólumot kezdetben állítsuk RomanNumeral.values ​​() értékre (0) WHILE numberal.length> 0: HA a szimbólum a szimbólum nevével kezdődik: add az eredményhez a szimbólum értékét szám kezdete ELSE: a szimbólum beállítása a következő szimbólumra

4.1. Végrehajtás

Ezután megvalósíthatjuk az algoritmust Java-ban:

public static int romanToArabic (String input) {String romanNumeral = input.toUpperCase (); int eredmény = 0; List romanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0; while ((romanNumeral.length ()> 0) && (i 0) {dobjon új IllegalArgumentException-t (a + + bemenet nem konvertálható római számgá ");} eredményt ad;}

4.2. Teszt

Végül kipróbálhatjuk a megvalósítást:

@Test public void given2018Roman_WhenConvertingToArabic_ThenReturn2018 () {String roman2018 = "MMXVIII"; int eredmény = RomanArabicConverter.romanToArabic (roman2018); assertThat (eredmény) .isEqualTo (2018); }

5. Arab-római

A következő algoritmust használhatjuk arra, hogy arabról római számra konvertáljunk (szimbólumokon keresztül iterálva fordított sorrendben kezdve M nak nek én):

A LET szám legyen egész szám 1 és 4000 között LET szimbólum legyen RomanNumeral.values ​​() [0] LET eredmény legyen üres karakterlánc WHILE szám> 0: HA a szimbólum értéke <= szám: az eredményt a szimbólum nevével egészíti ki, kivonva a szimbólum értékét a számból MÁS: válassza ki a következő szimbólumot

5.1. Végrehajtás

Ezután megvalósíthatjuk az algoritmust:

public static String arabicToRoman (int szám) {if ((4000-es szám)) {dobjon új IllegalArgumentException-t (a + + szám nincs a tartományban (0,4000] ");} RomanNumerals = RomanNumeral.getReverseSortedValues ​​(); int i = 0 ; StringBuilder sb = new StringBuilder (); while ((szám> 0) && (i <romanNumerals.size ())) {RomanNumeral currentSymbol = romanNumerals.get (i); if (currentSymbol.getValue () <= szám) { sb.append (currentSymbol.name ()); szám - = currentSymbol.getValue ();} else {i ++;}} return sb.toString ();}

5.2. Teszt

Végül kipróbálhatjuk a megvalósítást:

@Test public void given1999Arabic_WhenConvertingToRoman_ThenReturnMCMXCIX () {int arabic1999 = 1999; Karakterlánc eredménye = RomanArabicConverter.arabicToRoman (arab1999); assertThat (eredmény) .isEqualTo ("MCMXCIX"); }

6. Következtetés

Ebben a rövid cikkben bemutattuk, hogyan lehet konvertálni a római és az arab számokat.

Használtunk egy enum ábrázolja a római számok halmazát, és létrehoztunk egy segédosztályt az átalakítások elvégzésére.

A teljes megvalósítás és az összes teszt megtalálható a GitHub oldalon.


$config[zx-auto] not found$config[zx-overlay] not found