繁体   English   中英

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

[英]Why my parsing doesn't work?

我被要求做我的作业,以制作一个程序,其中用户输入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 ;
    }
}

两点:

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

此外,你试图返回一个String变量作为int 你甚至不叫getRoman ...

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

您正在做分​​配,比较必须使用==的基本类型,比较String的equals方法。

例:

如果(val.equals(“ I”))

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

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

对于这么小的char样本,可能最简单的方法是简单地创建一个查找表,并在char上建立索引。

您有任何错误吗?

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

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

以下语句是一个分配:

val = "I"

那绝对不是您想要在这里做的。

比较是使用double equals完成的,但是double equals( == )将比较引用,但您也不想在此进行。

您要使用equals方法。

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

随时随地进行更改,看看它如何为您工作。

实际上,您的主要麻烦来自字符串比较。 在Java中,=表示将值分配给变量,==表示比较原始类型的值,而equals是比较对象(尤其是字符串)的方式。

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

在解析罗马语言数字的情况下,您还可以考虑使用哈希图来有效存储和检索数字的解析值。 如果您要进行成千上万次这样的比较,请使用identityhashmap。

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

后2个注释更侧重于软件算法,前两个注释更侧重于Java语法。 在进行更高级别的优化之前,您应该开始了解语法。

问候,斯特凡

除了上面所说的有关String比较应如何使用equals(...)函数的内容外,例如,

if ( val.equals("VII") )

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

另外,您没有输入正确的参数类型-从外观上看,您的函数正在检查字符串以查看其是否为某个罗马数字。 因此正确的函数标头应如下所示:

public static int getRoman(String val)

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM