2016-07-06 17 views
0

Ich schreibe ein Programm, um zwei römische Ziffern hinzuzufügen, ohne zu irgendwelchen Basen zu konvertieren. Ich habe alles funktioniert, außer ich bin nicht sicher, wie man überprüft, ob meine Eingabe String eine gültige römische Zahl ist oder nicht.Java - römische Ziffer Gültigkeit

Dies sind die Regeln Gültigkeit zu überprüfen:

  1. Fünf in einer Reihe von jeder Ziffer ist nicht erlaubt
  2. Einige Stellen in Läufen I bis 4. Sie sind erlaubt, X, C, und M. Die anderen (V, L, D) können nur einzeln auftreten.
  3. Einige niedrigere Ziffern können vor einer höheren Ziffer stehen, aber nur wenn sie einzeln erscheinen. Z.B. "IX" ist in Ordnung, aber "IIIX" ist nicht in Ordnung.
  4. Aber das ist nur für die paar Ziffern. Drei aufsteigende Zahlen in Folge sind ungültig. Z.B. "IX" ist in Ordnung, aber "IXC" ist nicht in Ordnung.
  5. Eine einzelne Ziffer ohne läuft immer

Ich habe noch nicht wirklich in der Lage erlaubt, große Fortschritte mit diesem Schritt zu machen und haben nichts zu arbeiten. Jede Hilfe wäre großartig!

+0

Welche Code haben Sie bisher haben? Was tut es? Was hast du von ihm erwartet? – Robert

+1

Nummer 2 Prämisse wenn FALSCH: http://www.roman-numerals.org/chart100.html – Grayson

Antwort

1

Schleife durch jedes Zeichen in der Zeichenfolge. Verwenden Sie ein if-Bedingungen, um zu prüfen, welches Zeichen es ist. Verwenden Sie die if-Bedingungen, um nach Verletzungen der römischen Ziffern in den angrenzenden Zeichen des ausgewählten Zeichens zu suchen.

for(int i = 0; i < s.length(); i++){ 
    if (s[i] == 'V'){  
     **Check if the character before of after is also 'V'. Then it is a violation 
    }  
    else if(s[i] == 'L'){ 
     **Conditions for 'L' etc. 
    } 
} 
+0

Es scheint wie das vereinfacht, dass zu viel ist es nicht? Ich versuche, das zu kodieren, und es gibt in diesem Fall viele zu viele Bedingungen. – RajveerParikh

+0

Nicht wirklich .... Können Sie den Teil zeigen, den Sie bisher codiert haben? – Ivantha

1

Dies ist, was ich basierend auf meinen Regeln erstellt habe. Irgendwelche Überlegungen zum Refactoring, um es einfacher zu machen?

public static boolean checkValidity (String s1, HashSet<Character> romanNumerals){ 
    HashSet<Character> alreadyContained = new HashSet<Character>(); 
    if (s1.length() == 1 && romanNumerals.contains(s1.charAt(0))){ 
     return true; 
    } 
    int i = 0; 
    while (i < s1.length()){ 
     if (s1.charAt(i) == 'M'){ 
      if (alreadyContained.contains('M')){ 
       return false; 
      } 
      int count = 1; 
      i++; 
      while (s1.charAt(i) == 'M'){ 
       i++; 
       count++; 
      } 
      alreadyContained.add('M'); 
      if (count >= 5){ 
       return false; 
      } 
     } 
     else if (s1.charAt(i) == 'D'){ 
      if (alreadyContained.contains('D')){ 
       return false; 
      } 
      alreadyContained.add('D'); 
      if (!alreadyContained.contains('M')){ 
       alreadyContained.add('M'); 
      } 
      i++; 
      if ((i < s1.length()) && (s1.charAt(i) == 'D')){ 
       return false; 
      } 

     } 
     else if (s1.charAt(i) == 'L'){ 
      if (alreadyContained.contains('L')){ 
       return false; 
      } 
      alreadyContained.add('L'); 
      if (!alreadyContained.contains('M')){ 
       alreadyContained.add('M'); 
      } 
      if (!alreadyContained.contains('D')){ 
       alreadyContained.add('D'); 
      } 
      if (!alreadyContained.contains('C')){ 
       alreadyContained.add('C'); 
      } 
      i++; 
      if ((i < s1.length()) && (s1.charAt(i) == 'L')){ 
       return false; 
      } 
     } 
     else if (s1.charAt(i) == 'V'){ 
      if (alreadyContained.contains('V')){ 
       return false; 
      } 
      alreadyContained.add('V'); 
      if (!alreadyContained.contains('M')){ 
       alreadyContained.add('M'); 
      } 
      if (!alreadyContained.contains('D')){ 
       alreadyContained.add('D'); 
      } 
      if (!alreadyContained.contains('C')){ 
       alreadyContained.add('C'); 
      } 
      if (!alreadyContained.contains('L')){ 
       alreadyContained.add('L'); 
      } 
      if (!alreadyContained.contains('X')){ 
       alreadyContained.add('X'); 
      } 
      i++; 
      if ((i < s1.length()) && (s1.charAt(i) == 'V')){ 
       return false; 
      } 

     } 
     else if (s1.charAt(i) == 'C'){ 
      if (alreadyContained.contains('C')){ 
       return false; 
      } 
      int count = 1; 
      i++; 
      if ((i < s1.length()) &&(s1.charAt(i) == 'M' || s1.charAt(i) == 'D')){ 
       i++; 
      } 
      else if (i < s1.length() && s1.charAt(i) == 'C'){ 
       while ((i < s1.length()) && (s1.charAt(i) == 'C')){ 
        i++; 
        count++; 
       } 
      } 
      alreadyContained.add('C'); 
      if (!alreadyContained.contains('M')){ 
       alreadyContained.add('M'); 
      } 
      if (!alreadyContained.add('D')){ 
       alreadyContained.add('D'); 
      } 
      if (count >= 5){ 
       return false; 
      } 
     } 
     else if (s1.charAt(i) == 'X'){ 
      if (alreadyContained.contains('X')){ 
       return false; 
      } 
      int count = 1; 
      i++; 
      if ((i < s1.length()) && (s1.charAt(i) == 'D' || s1.charAt(i) == 'M')){ 
       return false; 
      } 
      while ((i < s1.length()) && s1.charAt(i) == 'X'){ 
       i++; 
       count++; 
      } 
      alreadyContained.add('X'); 
      if (count >= 5){ 
       return false; 
      } 
     } 
     else if (s1.charAt(i) == 'I'){ 
      if (alreadyContained.contains('I')){ 
       return false; 
      } 
      alreadyContained.add('I'); 
      i++; 
      int count = 1; 
      if ((i < s1.length()) && (s1.charAt(i) != 'I' && s1.charAt(i) != 'X' && s1.charAt(i) != 'V')){ 
       return false; 
      } 
      else if (i < s1.length() && s1.charAt(i) == 'I'){ 
       while (i < s1.length() && s1.charAt(i) == 'I'){ 
        i++; 
        count++; 
       } 
       if (count >= 4){ 
        return false; 
       } 
      } 
     } 
     else if (!romanNumerals.contains(s1.charAt(i))){ 
      return false; 
     } 
    } 
    return true; 
}