簡體   English   中英

Java-羅馬數字有效性

[英]Java - Roman Numeral validity

我正在編寫一個程序,以添加兩個羅馬數字而不轉換為任何基數。 除了我不確定如何檢查我的輸入String是否是有效的羅馬數字外,我可以進行所有工作。

這些是檢查有效性的規則:

  1. 不允許連續五位數字
  2. 某些數字最多可以運行4個。它們分別是I,X,C和M。其他數字(V,L,D)只能單獨出現。
  3. 某些較低的數字可以在較高的數字之前,但前提是它們單獨出現。 例如,“ IX”可以,但是“ IIIX”不能。
  4. 但這僅適用於數字對。 連續三個升序數字無效。 例如,“ IX”可以,但“ IXC”不能。
  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的帖子: 如何將僅有效的羅馬數字與正則表達式匹配?

遍歷字符串中的每個字符。 使用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.  
    }  
}  

這是我根據自己的規則提出的。 有什么想法可以簡化它嗎?

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM