Java - 将char输入(表示Roman Numeral)转换为十进制等效值

时间:2016-11-27 12:42:05

标签: java arrays methods

正如标题所示,我正在使用方法编写一个简单的编程,它将罗马数字的字符输入转换为(" M"," D"," C& #34;," L"," X"," V"," I")然后打印十进制等值。

我编写了程序,但它将decimal(int)转换为Roman Numeral

修改程序时只接受char输入(" M"," D"," C"," L", " X"," V","我")然后输出十进制,我得到错误,因为char无法转换为int。

有关如何更改此内容的任何建议。谢谢

import java.util.Scanner;

class RomanTest {
        public static int romanNumeralToInt(char romanNumeral) {
        String Numeral = "";
        int repeat;

        int value[] = {1000, 500, 100, 50, 10, 5, 1 };
        char symbol[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I' };

        for(char x = 0; romanNumeral > 0; x++) {
            repeat = romanNumeral / value[x];

            for(int i = 1; i <= repeat; i++) {
                Numeral = Numeral + symbol[x];
            }

            romanNumeral = romanNumeral % value[x];
        }

        return Numeral;
    }

    public static void main(String args[]){
        Scanner input = new Scanner(System.in);

        final String INVALID = "Invalid number, try again!";

        final char VALIDATE_CHAR_M = 'M';
        final char VALIDATE_CHAR_D = 'D';
        final char VALIDATE_CHAR_C = 'C';
        final char VALIDATE_CHAR_L = 'L';
        final char VALIDATE_CHAR_X = 'X';
        final char VALIDATE_CHAR_V = 'V';
        final char VALIDATE_CHAR_I = 'I';


        while (true) {
            System.out.print("Enter a number: ");
            char inputValue = input.nextLine().charAt(0);

            if (inputValue == VALIDATE_CHAR_M) {
                System.out.println(VALIDATE_CHAR_M + " = " + romanNumeralToInt('M'));
            }
            else if (inputValue == VALIDATE_CHAR_D) {
                System.out.println(VALIDATE_CHAR_D + " = " + romanNumeralToInt('D'));
            }
            else if (inputValue == VALIDATE_CHAR_C) {
                System.out.println(VALIDATE_CHAR_C + " = " + romanNumeralToInt('C'));
            }
            else if (inputValue == VALIDATE_CHAR_L) {
                System.out.println(VALIDATE_CHAR_L + " = " + romanNumeralToInt('L'));
            }
            else if (inputValue == VALIDATE_CHAR_X) {
                System.out.println(VALIDATE_CHAR_X + " = " + romanNumeralToInt('X'));
            }
             else if (inputValue == VALIDATE_CHAR_V) {
                System.out.println(VALIDATE_CHAR_V + " = " + romanNumeralToInt('V'));
            }
             else if (inputValue == VALIDATE_CHAR_I) {
                System.out.println(VALIDATE_CHAR_I + " = " + romanNumeralToInt('I'));
            }
             else {
                 System.out.println(INVALID);
             }
        }

    }
}

更新 根据post建议修改代码,但由于String无法转换为Int,因此仍然存在错误。有什么建议。谢谢

/car.png

3 个答案:

答案 0 :(得分:1)

首先你要注意public static int romanNumeralToInt(char romanNumeral)它应该返回int,但是你要返回String Numeral = ""; - 它的字符串,Java作为C#是强类型语言,所以你必须返回串。 第二:以你正在做的方式连接String  for(int i = 1; i <= repeat; i++) { Numeral = Numeral + symbol[x]; } 不建议使用(太慢,String是不可变的,因此在创建新String的每个连接中都是如此)。更好的方法是使用StringBuilder。

我修改了您的代码并附带了类似的内容:

private String decimalToRoman(int number) {
    String[] romans = {"M", "CM", "D", "C", "XC", "L", "X", "IX", "V", "I"};
    int[] values = {1000, 900, 500, 100, 90, 50, 10, 9, 5, 1};
    StringBuilder builder = new StringBuilder();


    for (int i = 0; i < values.length; i++) {
        int times= number / values[i];

        if (times== 0) {
            continue;
        }

        if (times == 4 && i > 0) {
            builder.append(romans[i]);
            builder.append(romans[i - 1]);
        } else {
            for (int ii = 0; ii < times; ii ++) {
                builder.append(romans[i]);
            }
        }

        number = number % values[i];
    }
    return builder.toString();
}

答案 1 :(得分:0)

你正在以错误的方式做事。这是一种方法。

class RomanNumeral {

    public static void romanNumeralToInt(String romanNumeral) {

        Map<Character,Integer> mapping = new HashMap<>();
        mapping.put('M',1000);
        mapping.put('D',500);
        mapping.put('C',100);
        mapping.put('L',50);
        mapping.put('X',10);
        mapping.put('V',5);
        mapping.put('I',1);

        int result = 0;
        for(char each : romanNumeral.toCharArray()){
            if(mapping.containsKey(each)){
                result += mapping.get(each);    
            }
            else{
                System.out.println("Invalid number");
                return;
            }
        }
        System.out.println(result);
    }

    public static void main(String args[]) {    
        Scanner input = new Scanner(System.in); 
        System.out.print("Enter a number: ");
        String inputValue = input.nextLine();
        romanNumeralToInt(inputValue);
    }

}

答案 2 :(得分:0)

main方法中的代码已经只接受值1000,500,100,50,10,5,1。然后在您的romanNumeralToInt中,有一些操作是不必要的。因为您已经有两个数组映射,例如1到I或5到V.如果在int数组中找到索引1,那么您的罗马数字是符号[foundIndex]。我没有得到那两个for循环的目的。

  

我收到错误,因为char无法转换为int。

char可以转换为int。但“M”不是char,它是一个String。 'M'是一个字符。

您可以通过以下方式从用户获取char:

char charValue = input.nextLine().charAt(0);