Römische Buchstaben in Arabische Zahlen umwandeln

freebeer

Mitglied
Hallo und schönen guten Tag!
Ich muss ein Programm schreiben, welches mir römische Buchstaben in arabische Zahlen umwandelt.
Das ganze sieht bisher so aus:
Java:
String [] rom =  { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};   
int [] arab = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
List<String> neu = new ArrayList<String>();

    for(int i=0; i<=rom.length;i++) {
            while((zahl - arab[i]) >= 0) {
                zahl = zahl - arab[i];
                neu.add(rom[i]);   
            }
        }

dachte eigentlich es müsste so funktionieren, nur leider schmeißt mir der Compiler eine Array OutOfBoundsException in der Zeile sechs, also beim bearbeiten der while-Schleife.

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Index 13 out of bounds for length 13

lautet die Exception

Kann mir jemand verraten warum? Bin ein bisschen am verzweifeln
 
Zuletzt bearbeitet:

M.L.

Top Contributor
Arrays in Java sind null-terminiert, der erste Index wäre also die "0" (im Ggs. zum menschlichen Zählen mit 1,2,3,...). Statt "...i<=rom.length..." könnte "..i < rom.length..." helfen
 

KonradN

Super-Moderator
Mitarbeiter
Dachte nur das es eigentlich so funktionieren müsste, da die for-Schleife ja bei 0 beginnt und nicht bei 1?
Ja, der Teil ist ja auch richtig. Der index startet bei 1,, d.h. das erste Element hat Index 0, das zweite Element hat Index 1, ... das n.te Element hat damit den Index n-1.

Wenn also rom.length die Anzahl der Elemente im Array rom angibt, dann geht der Index von 0 bis rom.length-1. Und daher darf die Schleife auch nur die Werte kleiner als rom.length durchlaufen.
 

KonradN

Super-Moderator
Mitarbeiter
und es ist auch ein Pattern, Dinge nicht mehrfach zu implementieren ...
Wobei ich bezüglich Pattern eher sehe, dass man nicht für jedem kleinen Scheiß direkt eine Library einbinden sollte. Da gilt immer noch der Grundsatz: So viel wie nötig, so wenig wie möglich.

Abhängigkeiten will man nun einmal reduzieren. Egal ob Abhängigkeiten zwischen Klassen oder eben auch zwischen Komponenten.

Aber bei einer Übungsaufgabe ist es natürlich - wie @thecain schon richtig sagte - wenig sinnvoll. Da geht es nun einmal um das Erlernen von Grundlagen.
 

fireGlurak

Mitglied
Was spricht denn gegen eine Map? Damit hat man es einfacher

Java:
import java.util.HashMap;

public class demo {

    public static void main(String[] args) {
        System.out.println(roemToArabic("CM"));
    }
    
    private static int roemToArabic(String roem) {
        HashMap<String, Integer> hash = new HashMap<>();
        
        hash.put("M", 1000);
        hash.put("CM", 900);
        hash.put("D", 500);
        //usw...
        
        return hash.get(roem);       
    }

}
 

KonradN

Super-Moderator
Mitarbeiter
Was spricht denn gegen eine Map? Damit hat man es einfacher
Die Idee ist richtig. Aber für die Umwandlung hin zu römischen Ziffern wäre dann die TreeMap sinnvoller. Damit hast Du die Methode floorEntry(), die Du direkt nutzen könntest.

Und in der anderen Richtung müsstest Du halt beachten, dass Du immer erst die nächsten zwei Ziffern prüfen müsstest und wenn es die nicht gibt, dann nur das nächste Zeichen. Und das müsste Deine Methode dann entsprechend machen. Denn wenn ich in der Methode jetzt XVI versuche zu übersetzen, dann kommt das Ergebnis da nicht raus ohne diese zusätzliche Logik.
 

philanthrop

Bekanntes Mitglied
Die Idee mit der Map finde ich inzwischen richtig geil ... Hier mal mein Ansatz:

Java:
import java.util.Arrays;

public class Rom {
    private static final String[] rom = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    private static final int[] arab = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};

    public static void main(final String[] args) {
        String[] roms = new String[10_000];
        Arrays.fill(roms, "");
        for (int i = 1; i <= 9999; i++) {
            int j = 0;
            int x = i;
            while (x != 0) {
                if (arab[j] > x) {
                    j++;
                } else {
                    x -= arab[j];
                    roms[i] += rom[j];
                }
            }
        }
        System.out.println(String.join("   ", roms));
    }
}

Bin nur noch nicht sicher, ob auch richtig^^
 

Neue Themen


Oben