Java 罗马数字到数字的转换

Java 罗马数字到数字的转换,java,Java,试图编写程序,读入表示罗马数字的字符串(来自用户输入),然后将其转换为阿拉伯形式(整数)。例如,I=1,V=5,X=10等等 基本上,接受String类型参数的构造函数必须将字符串(来自用户输入)解释为罗马数字,并将其转换为相应的int值 除了下面正在进行的(尚未编译)之外,还有更简单的方法来解决这个问题吗 import java.util.Scanner; 公共类RomInt{ 弦罗马; int-val; 无效分配(字符串k) { 罗马=k; } 私有类文字 { 公共字符文本; 公共价值观;

试图编写程序,读入表示罗马数字的字符串(来自用户输入),然后将其转换为阿拉伯形式(整数)。例如,I=1,V=5,X=10等等

基本上,接受String类型参数的构造函数必须将字符串(来自用户输入)解释为罗马数字,并将其转换为相应的int值

除了下面正在进行的(尚未编译)之外,还有更简单的方法来解决这个问题吗

import java.util.Scanner;
公共类RomInt{
弦罗马;
int-val;
无效分配(字符串k)
{
罗马=k;
}
私有类文字
{
公共字符文本;
公共价值观;
公共文本(字符文本,int值)
{
this.literal=literal;
这个值=值;
}
}
私有最终文字[]罗马文字=新文字[]
{
新文字('I',1),
新文字('V',5),
新文字('X',10),
新文字('L',50),
新文字('C',100),
新文字('D',500),
新文字('M',1000)
};
公共int getVal(字符串s){
int holdValue=0;
for(int j=0;j
使用
enum
,以获得简单易用的解决方案。首先定义十进制的罗马当量

enum Roman{
    i(1),iv(4),v(5), ix(9), x(10);
    int weight;

    private Roman(int weight) {
        this.weight = weight;
    }
};
这是将十进制字符串转换为罗马字符串的方法

static String decToRoman(int dec){
    String roman="";
    Roman[] values=Roman.values();
    for (int i = values.length-1; i>=0; i--) {
       while(dec>=values[i].weight){
           roman+=values[i];
           dec=dec-values[i].weight;
       }            
    }
    return roman;
}

class罗马语{
专用静态整型解码单字符(字符字母){
开关(字母){
案例“M”:
返回1000;
案例“D”:
返回500;
案例“C”:
返回100;
案例“L”:
返回50;
案例“X”:
返回10;
案例“V”:
返回5;
案例“I”:
返回1;
违约:
返回0;
}
}
公共静态整数解码(字符串罗马){
int结果=0;
字符串uRoman=roman.toUpperCase();//不区分大小写
对于(int i=0;i
您可以尝试使用Hashmap存储罗马数字和等效阿拉伯数字

HashMap test=新的HashMap()

要检索用户输入的相应阿拉伯数字,可以使用以下代码:

Scanner sc = new Scanner(System.in);
System.out.println(one.get(sc.next().toUpperCase()));
//This would print the respective value of the selected key.This occurs in O(1) time.
其次,

如果您只有这组罗马数字,那么您可以使用简单的switch case语句

switch(sc.next().toUpperCase())
{
case 'I' :
     System.out.println("1");
     break;
case 'V'
     System.out.println("5");
     break;
.
.
.
& so on 
}
希望这有帮助。

这个怎么样:

public static int convertFromRoman(String roman) {
    Map<String, Integer> v = new HashMap<String, Integer>();
    v.put("IV", 4);
    v.put("IX", 9);
    v.put("XL", 40);
    v.put("CD", 400);
    v.put("CM", 900);
    v.put("C", 100);
    v.put("M", 1000);
    v.put("I", 1);
    v.put("V", 5); 
    v.put("X", 10);
    v.put("L", 50);
    v.put("D", 500);
    int result = 0;
    for (String s : v.keySet()) {
     result += countOccurrences(roman, s) * v.get(s);
     roman = roman.replaceAll(s, "");
    }

    return result;
}



public static int countOccurrences(String main, String sub) {
   return (main.length() - main.replace(sub, "").length()) / sub.length();
} 
公共静态int-convertfroman(字符串罗马){
Map v=新的HashMap();
v、 付诸表决(“IV”,第4段);
v、 付诸表决(“IX”,9);
v、 放入(“XL”,40);
v、 put(“CD”,400);
v、 放入(“厘米”,900);
v、 付诸表决(“C”,100);
v、 put(“M”,1000);
v、 付诸表决(“I”,1);
v、 放(v,5);;
v、 放置(“X”,10);
v、 付诸表决(“L”,50);
v、 付诸表决(“D”,500);
int结果=0;
对于(字符串s:v.keySet()){
结果+=计数次数(罗马,s)*v.get(s);
罗马=罗马。全部替换为“”;
}
返回结果;
}
公共静态整数计数(字符串主、字符串子){
返回(main.length()-main.replace(sub,“”.length())/sub.length();
} 

我不确定我有所有可能的组合,因为我不是罗马数字专家。只需确保在映射图中减法的位置排在第一位。

您的编译问题可以通过以下代码解决。但肯定不是优化的:

public static void main(String[] args)
{
    Scanner keyboard = new Scanner(System.in);
    System.out.print("Please enter Roman Symbol:");
    String s = keyboard.nextLine();

    RomInt temp = new RomInt();
    temp.getVal(s);
    temp.assign(s);
    temp.disp();
}

这个问题对于堆栈溢出来说过于宽泛。请继续工作,如果您有具体问题,请询问我们。您可能会在代码审阅中获得更多的一般性输入,但如果您描述您的算法而不是粘贴一大块不工作的代码,则更有可能获得有用的帮助。您是否只需要这些数字的输出?需要显示它们还是需要使用这些转换后的阿拉伯数字以供进一步使用?乍一看,您不是在创建RomInt类的对象不适用于IIIM,这是无效的Roman。
switch(sc.next().toUpperCase())
{
case 'I' :
     System.out.println("1");
     break;
case 'V'
     System.out.println("5");
     break;
.
.
.
& so on 
}
public static int convertFromRoman(String roman) {
    Map<String, Integer> v = new HashMap<String, Integer>();
    v.put("IV", 4);
    v.put("IX", 9);
    v.put("XL", 40);
    v.put("CD", 400);
    v.put("CM", 900);
    v.put("C", 100);
    v.put("M", 1000);
    v.put("I", 1);
    v.put("V", 5); 
    v.put("X", 10);
    v.put("L", 50);
    v.put("D", 500);
    int result = 0;
    for (String s : v.keySet()) {
     result += countOccurrences(roman, s) * v.get(s);
     roman = roman.replaceAll(s, "");
    }

    return result;
}



public static int countOccurrences(String main, String sub) {
   return (main.length() - main.replace(sub, "").length()) / sub.length();
} 
public static void main(String[] args)
{
    Scanner keyboard = new Scanner(System.in);
    System.out.print("Please enter Roman Symbol:");
    String s = keyboard.nextLine();

    RomInt temp = new RomInt();
    temp.getVal(s);
    temp.assign(s);
    temp.disp();
}