[英]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.