Java - 罗马数字有效性

时间:2016-07-06 00:17:14

标签: java validation roman-numerals

我正在编写一个程序来添加两个罗马数字而不转换为任何基础。我有一切工作,但我不知道如何检查我的输入字符串是否是一个有效的罗马数字。

这些是检查有效性的规则:

  1. 不允许连续五位数
  2. 在最多4次运行中允许使用一些数字。它们是I,X,C和M.其他(V,L,D)只能单独出现。
  3. 一些较低的数字可以在较高的数字之前,但只有它们单独出现时才会出现。例如。 “IX”没问题,但“IIIX”没有。
  4. 但这仅适用于数字对。连续三个递增的数字无效。例如。 “IX”没问题,但“IXC”没有。
  5. 始终允许没有跑步的单个数字
  6. 我在这一步没有取得多大进展,也没有任何工作。任何帮助都会很棒!

3 个答案:

答案 0 :(得分:5)

为什么不使用正则表达式:

boolean valid = word.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$");

看看paxdiablo的帖子: How do you match only valid roman numerals with a regular expression?

答案 1 :(得分: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.  
    }  
}  

答案 2 :(得分: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;
}