2016-07-06 2 views
0

Я пишу программу для добавления двух римских цифр без преобразования на любые базы. У меня все работает, но я не уверен, как проверить, является ли моя строка ввода действительной римской цифрой или нет.Java - Действительность римской цифры

Эти правила для проверки достоверности:

  1. Пять в ряд каких-либо цифр не допускается
  2. Некоторые цифры допускаются в пробегов до 4. Они I, X, C, и M. Другие (V, L, D) могут появляться только по отдельности.
  3. Некоторые нижние разряды могут иметь место перед более высокой цифрой, но только если они появляются отдельно. Например. «IX» - это нормально, но «IIIX» - нет.
  4. Но это только для пар цифр. Три возрастающих числа в строке недопустимы. Например. «IX» в порядке, но «IXC» - нет.
  5. одноразрядный, без прогонов всегда разрешен

Я на самом деле не был в состоянии сделать значительный прогресс с этим шагом и не имеет ничего еще работает. Любая помощь будет замечательной!

+0

Какой код у вас до сих пор? Что оно делает? Что вы ожидали от этого? – Robert

+1

Номер 2, если FALSE: http://www.roman-numerals.org/chart100.html – Grayson

ответ

1

Петля через каждый символ в строке. Используйте условия if, чтобы проверить, какой символ он есть. Используйте условия if, чтобы проверить нарушение римских цифр в соседних символах выбранному символу.

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

Кажется, что это упрощает это, не так ли? Я пытаюсь закодировать это, и в этом случае слишком много условий для учета. – RajveerParikh

+0

Не совсем .... Можете ли вы показать часть, которую вы закодировали до сих пор? – Ivantha

1

Это то, что я придумал, основываясь на моих правилах. Любые мысли по рефакторингу, чтобы сделать его проще?

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; 
} 
Смежные вопросы