正如标题所示,我正在使用方法编写一个简单的编程,它将罗马数字的字符输入转换为(" 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
答案 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);