为什么我的解析不起作用?

时间:2011-08-07 12:59:21

标签: java parsing

我被要求做作业,制作一个程序,其中用户输入1-10之间的罗马数字并输出十进制等值。因为我将在输入中获取一个字符串并在输出中获得一个整数,所以我解析了它,但它不起作用。有什么想法吗?

import java.util.Scanner ;

class Romans {

    static Scanner s = new Scanner(System.in) ;
    static String val = null ;

    public static void main (String [] args)
    {
        System.out.print ("Enter a roman numeral between I to X: ");
        String val = s.nextLine();

        int e = Integer.parseInt(val);
    }
    static int getRoman (int e)
    {
        if (val = "I"){
            System.out.print ("1") ;
        }else if (val = "II" ){
            System.out.print ("2") ;
        }else if (val = "III") {
            System.out.print ("3") ;
        } else if (val = "IV") {
            System.out.print ("4") ;
        } else if (val = "V"){
            System.out.print ("5");
        } else if (val = "VI") {
            System.out.print ("6");
        } else if (val = "VII") {
            System.out.print ("7");
        } else if (val = "VIII") {
            System.out.print ("8");
        } else if (val = "IX") {
            System.out.print ("9");
        } else if (val = "X") {
            System.out.print ("10") ;
        }
        return val ;
    }
}

8 个答案:

答案 0 :(得分:4)

两点:

  • =是赋值运算符,而不是相等测试运算符(==
  • 您不应该使用==来测试字符串相等性,因为它只会测试引用的相等性;使用equals来测试两个字符串引用是否引用相等(但可能是不同的)字符串对象。

此外,您尝试将String变量作为int返回,您甚至不会调用getRoman ...

答案 1 :(得分:1)

我想我们可以告诉你,比较字符串的正确方法是使用equals()。

您正在进行分配,比较您要使用的原始类型==,以比较String等于equals方法。

示例:

if(val.equals(“I”))

但是getRoman()方法中也没有val。

答案 2 :(得分:1)

您正在尝试将val解析为int,但不是,它是一个字符。

对于如此少量的字符样本,最简单的方法是创建一个查找表,将其编入索引。

答案 3 :(得分:0)

你有任何错误吗?

在您的代码中,您永远不会调用getRoman函数。此外,您正在使用赋值运算符=而不是比较运算符“I”.equals(val)。

答案 4 :(得分:0)

字符串比较应使用equals(String str)方法而不是==进行比较。 PS。无论如何,您有=而不是==

答案 5 :(得分:0)

以下陈述是一项任务:

val = "I"

这绝对是你想在这里做什么。

使用double equals进行比较,但是double equals(==)比较引用,但您不想在此处执行此操作。

您想使用equals方法。

if (val.equals("I")) ...

随时随地进行更改并了解它是如何运作的。

答案 6 :(得分:0)

实际上你的主要麻烦来自字符串比较。在java中,=表示为变量赋值,==表示比较基本类型的值,equals是比较对象的方式,特别是对于字符串。

使用equals的替代方法可以是使用JDK内部字符串池,在这种情况下,您可以使用==作为比较器。

在解析罗马语言数字的情况下,您还可以考虑使用散列映射来有效地存储和检索已解析的数字值。如果您要进行数千次这样的比较,请转到identityhashmap。

最后,如果你想对所有罗马数字进行真正的解析,而不仅仅是第一个,那么你应该考虑使用自动机,即状态机以某种递归方式解析数字,这将是更多有效的模型适用于您的问题。

最后两个评论更倾向于软件算法,前两个更倾向于java语法。在进行更高级别的优化之前,您应该开始了解语法。

此致  斯特凡

答案 7 :(得分:0)

除了上面提到的关于你的String比较应该如何使用equals(...)函数的内容之外 - 例如,

if ( val.equals("VII") )

您还需要为名为getRoman的函数提供返回值。此函数被声明为一个函数,它向调用者返回一个整数值,但在您提供的实现中,没有返回值(只有System.out.println(...))。

此外,您没有输入正确的参数类型 - 从它的外观看,您的函数正在检查字符串以查看它是否是某个罗马数字。所以正确的函数头看起来像这样:

public static int getRoman(String val)

另外,请确保您实际在main()中调用此函数 - 从现在的样子开始,您甚至不使用getRoman()函数。

希望这有帮助!