Enum Römische Zahlen

Karlter

Mitglied
Moin Leute,

icn bastle mometan aufgrund einer Uniaufgabe an einer Klasse, welche eine Römische Zahl darstellen soll. Hierfür benutze ich Enums. Ich habe die Funktionalität der Klasse soweit ganz gut implementieren können, scheitere aber nun bei der Umsetzung der Anwendung der Subtraktionsregel in meiner toString() Methode. Mir ist es zu stumpf die KI zu fragen, daher wende ich mich erstmal an Euch - Hättet Ihr einen Denkanstoß, welche Logik man nutzen könnte, um die Suntraktionsregel zu beachten? Meinen Code füge ich Euch ein, ich hatte jetzt erstmal daran gedacht, die Paare bei denen es relevant ist (also IV für 4 (statt 5 - 1), IX für 9 (statt 10 - 1), XL für 40 (statt 50 - 10), XC für 90 (statt 100 - 10), CD für 400 (statt 500 - 100), CM für 900 (statt 1000 - 100)) zu identifizieren und dann eine bestimmte Ausnahme zu fomulieren. Aber bei der Umestzung scheitert es aktuell noch...

Java:
public enum Roman {
    I(1, '\u2160'),
    V(5,'\u2164'),
    X(10,'\u2169'),
    L(50,'\u216C'),
    C(100,'\u216D'),
    D(500,'\u216E'),
    M(1000,'\u216F');

    private final int value;
    private final char literal;

    Roman(int value, char literal) { // eigener Konstruktor
        this.value = value;
        this.literal = literal;
    }

    public int getValue() { // Methode
        return value;
    }

    public char getLiteral() {
        return literal;
    }
    
}



public class RomanNumber {

    int value;

    public RomanNumber(int i) {
        assert i > 0;
        value = i;
    }

    public RomanNumber(String s) {
        assert s != null;
        assert !s.isEmpty();

        int value = 0;

        for (char c : s.toCharArray()) {
            Roman r = Roman.valueOf(c + "");
            value += r.getValue();

        }
        this.value = value;

    }

    public int getValue() {
        return value;
    }

    public String toString() {
        StringBuilder b = new StringBuilder();

        Roman[] r = Roman.values();

        int rest = value;

        for (int i = r.length - 1; i >= 0; i--) {  // Hier ggf. Anwendnug der Subtraktionsregel
            while (r[i].getValue() <= rest) {
                b.append(r[i].getLiteral());
                rest -= r[i].getValue();
            }
        }

        return b.toString();
    }
}

Danke für Eure Zeit!
 

Oneixee5

Top Contributor
Ein Enum kann doch aus mehreren Zeichen bestehen.
Java:
XL(10,"u2169\u216C"),
Die Antwort verstehe ich nicht.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Wenn Du das enum Roman nicht anpassen willst (Was ok ist, denn da geht es ja um römische Zeichen und es geht ja um Combos aus römischen Zeichen), dann musst Du das halt in RomanNumber berücksichtigen.

Damit es verständlicher wird, kannst Du eine Liste mit Umwandlungs-Werten pflegen. Da kommen dann halt alle römischen Ziffer rein aber auch alle Ziffern Kombinationen. Dann hast du das als Basis zur Umwandlung, sprich: Wenn Du etwas wie IX hast, dann weisst Du: Das ist 9. Oder wenn Du eine 9 umwandeln willst, dann kannst Du schauen, was da der nächste mögliche Wert ist ...


Du kannst aber auch prüfen, ob ein Algorithmus möglich ist. Das ist auch nicht wirklich komplex.
Ich will Dir da nicht zu viel vorgeben, aber was für Regeln gelten denn da?

Wenn man die römischen Ziffern betrachtet, dann haben wir da sozusagen Hauptwerte und Zwischenwerte. Zwischenwerte sind die Werte, die doppelt genommen das Folgeelement ergeben. Zwischenwerte kommen immer einzeln vor und nie vor einem größeren Wert.
Eine kleinere Ziffer vor einer größeren Ziffer wird nicht addiert sondern abgezogen. Bei IV wird also der Wert vom I nicht addiert sondern abgezogen, so dass Du -1 + 5 erhältst.

Damit kannst Du schon gut umwandeln von römisch nach dezimal, aber es werden auch ungültige Zahlen umgewandelt. Da kann man also noch mehr bewerten: Bei zwei Ziffern muss gelten:
  • die erste ist größer wie die zweite (XI - beide werden addiert)
  • die erste ist kleiner wie die zweite: Dann darf die erste kein Zwischenwert sein und die zweite Ziffer muss die nächste oder übernächste Ziffer sein. Also kein IL oder so sondern nur IV und IX

Wenn Du in die andere Richtung umwandeln willst, dann musst Du halt für jeden Wert prüfen: Gibt es Kombinationen und wenn ja: passen diese?

Da wir die Regeln für Kombinationen aufgestellt haben (Dies ggf. noch einmal prüfen) ist das ja problemlos auch im Code aufstellbar.
 

Blender3D

Top Contributor
Meinen Code füge ich Euch ein, ich hatte jetzt erstmal daran gedacht, die Paare bei denen es relevant ist (also IV für 4 (statt 5 - 1), IX für 9 (statt 10 - 1), XL für 40 (statt 50 - 10), XC für 90 (statt 100 - 10), CD für 400 (statt 500 - 100), CM für 900 (statt 1000 - 100)) zu identifizieren und dann eine bestimmte Ausnahme zu fomulieren. Aber bei der Umestzung scheitert es aktuell noch...
Ich habe deine toString Methode etwas angepasst und der Klasse Roman eine Methode isBasisNumber (I,X,C,M) hinzugefügt.

Java:
public class StartRomanNumber {
    public static void main(String[] args) {
        for (int i = 1; i <= 1984; i++)
            System.out.println(i + "\t= " + new RomanNumber(i));
    }
}
Java:
public class RomanNumber {

    private int value;

    public RomanNumber(int value) {
        assert value > 0;
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public String toString() {
        StringBuilder str = new StringBuilder();
        Roman[] r = Roman.values();
        int rest = value;
        for (int i = r.length - 1; i >= 0; i--) {
            int val = 0;
            while ((val = r[i].getValue()) <= rest) {
                if (rest == 4) { // 4 -> IV
                    str.append(r[0] + "" + r[1]);
                    rest = 0;
                } else {
                    int diff = val;
                    if (!r[i].isBasisNumber()) {
                        diff = r[i + 1].getValue() - r[i - 1].getValue();
                        if (diff <= rest) // 90 -> XC
                            str.append(r[i - 1] + "" + r[i + 1]);
                        else { // 70 or 80 -> V only
                            str.append(r[i]);
                            diff = r[i].getValue();
                        }
                    } else
                        str.append(r[i]);
                    rest -= diff;
                }
            }
        }
        return str.toString();
    }
}
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
S Java Enum Java Basics - Anfänger-Themen 2
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
V Enum Java Basics - Anfänger-Themen 1
C Farben als Enum Java Basics - Anfänger-Themen 3
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
I JAXB und Enum Java Basics - Anfänger-Themen 7
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
A enum Java Basics - Anfänger-Themen 6
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
N Java Enum converter Methode Java Basics - Anfänger-Themen 5
F Enum von Ländern Java Basics - Anfänger-Themen 8
J Klassen Enum als Informationsträger Java Basics - Anfänger-Themen 10
T Datentypen enum static Chaos (blutiger anfänger) Java Basics - Anfänger-Themen 5
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
E Objektvergleich Enum Java Basics - Anfänger-Themen 7
kilopack15 Euromünzen in enum als Liste ausgeben Java Basics - Anfänger-Themen 11
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
S Menüauswahl per Enum Java Basics - Anfänger-Themen 12
F Enum via String definieren Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
M java.lang.Enum.valueOf(Unknown Source) Java Basics - Anfänger-Themen 2
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
P Fallunterscheidung mit Überprüfung (enum) Java Basics - Anfänger-Themen 11
H enum Type Java Basics - Anfänger-Themen 6
F Operatoren Enum aus Textdabei laden Java Basics - Anfänger-Themen 3
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
kaoZ Variablen Konstantensammlung vs. Enum Java Basics - Anfänger-Themen 9
H Enum außerhalb einer Klasse? Java Basics - Anfänger-Themen 2
K OOP Aufzählungstypen! enum Currency!!! Java Basics - Anfänger-Themen 5
F ENUM als Variable Java Basics - Anfänger-Themen 4
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
W Enum Konstruktor Type Java Basics - Anfänger-Themen 2
A Erste Schritte ENUM - Werte zurückgeben Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
F Datentypen enum Java Basics - Anfänger-Themen 5
J Enum zählen Java Basics - Anfänger-Themen 8
D Einlesen eines Enum-Wertes per console Java Basics - Anfänger-Themen 3
K String mit ENUM vergleichen? Java Basics - Anfänger-Themen 6
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
J public enum? in Java Java Basics - Anfänger-Themen 9
D Erste Schritte Enum - das unbekannte Wesen Java Basics - Anfänger-Themen 3
Y ENUM auslesen (Name des ENUM als Variable) Java Basics - Anfänger-Themen 4
P Compiler-Fehler "class, interface, or enum expected" Java Basics - Anfänger-Themen 5
K class, interface or enum expected Java Basics - Anfänger-Themen 14
pg1337 enum-Aufgabe Java Basics - Anfänger-Themen 5
N was sagt enum aus? Java Basics - Anfänger-Themen 3
S Methoden Enum Parameter in Methode Java Basics - Anfänger-Themen 7
G Datentypen enum Frage Java Basics - Anfänger-Themen 3
R Probleme mit Enum Java Basics - Anfänger-Themen 10
B Enum: Instanzen Java Basics - Anfänger-Themen 10
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
T class, interface, or enum expected Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
4 Enum Problem Java Basics - Anfänger-Themen 2
turmaline Bindestrich in enum? Java Basics - Anfänger-Themen 5
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
T ist enum.ordinal keine Konstante? Java Basics - Anfänger-Themen 7
R State machine mit enum Java Basics - Anfänger-Themen 9
L enum aus Integer umwandeln Java Basics - Anfänger-Themen 3
C Klasseninstanzierung mit enum-Parameter erzwingen Java Basics - Anfänger-Themen 2
I Enum in String Java Basics - Anfänger-Themen 4
N enum richtig verwenden Java Basics - Anfänger-Themen 5
M for(Enum..., ButtonGroup.getElements()... Java Basics - Anfänger-Themen 3
StrikeTom Fragen zu enum Java Basics - Anfänger-Themen 4
A Was ist performanter für Konstanten, enum oder static variablen Java Basics - Anfänger-Themen 5
L String zu Enum parsen Java Basics - Anfänger-Themen 8
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
S OOP Durch ein Enum iterieren... Java Basics - Anfänger-Themen 47
K Datentypen enum und liste Java Basics - Anfänger-Themen 7
S String - Enum Java Basics - Anfänger-Themen 3
H Eine enum switchen? Java Basics - Anfänger-Themen 7
G enum für Typsicherheit Java Basics - Anfänger-Themen 9
J class, interface, or enum expected - finde Fehler nicht. Java Basics - Anfänger-Themen 4
J OOP enum Java Basics - Anfänger-Themen 2
O Problem (Enum) Java Basics - Anfänger-Themen 14
S Enum als Index Java Basics - Anfänger-Themen 5
H Enum --> int ?? Java Basics - Anfänger-Themen 3
tanja enum in java Java Basics - Anfänger-Themen 3
D class, interface or enum expected Java Basics - Anfänger-Themen 2
A OOP Übergabe eines Wertes an den enum Konstruktor Java Basics - Anfänger-Themen 12
T Simple Enum Fragen Java Basics - Anfänger-Themen 6
J class, interface, or enum expected Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben