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.