我的总数没有在我的循环中更新

时间:2017-09-25 21:18:12

标签: java roman-numerals

我是java的新手,我很困惑为什么变量total没有更新。当我打印它时,它只打印初始数字0.此外,方法值返回基于罗马字符的数字。我遗漏了课程,但这不重要。

public static void main(String[] args)
{
    double total = 0;
    String romanString = "MCMLXXVIII";
    double difference = 0;


    while (romanString.length() > 0 )
    {
        if (romanString.length() == 1 || value(romanString.substring(0, 1)) >= value(romanString.substring(1, 2)))
        {
            total = total + value(romanString.substring(0, 1));
            romanString = romanString.substring(1);
        }
        else
        {
            difference =  value(romanString.substring(1, 2)) - value(romanString.substring(0, 1));
            total = total + difference;
            romanString = romanString.substring(1);

        }
    System.out.println(total)   
    }

}

public static double value(String character)
{
    if (character == "I")
        return 1;       

    else if (character == "V")
        return 5;       

    else if (character == "X")
        return 10;      

    else if (character == "L") 
        return 50;      

    else if (character == "C")
        return 100;     

    else if (character == "D")
        return 500;     

    else if (character == "M")
        return 1000;

    return 0;
}   

}

3 个答案:

答案 0 :(得分:3)

String是一个对象,所以我认为在你的value()方法中,你必须使用.equals()来避免比较内存地址。目前,使用==时,value()将始终返回0,因为您正在比较2个内存地址。

答案 1 :(得分:0)

我猜测所有问题都来自您的valu()方法,实际上最大的问题是您要将字符串与==进行比较而不是.equals()==比较仅用于原始类型。

如果您使用.equals()语句而不是所有这些Switch语句进行比较,则可以使用if或更好的方法解决此问题。

另一件事是您使用double作为value()方法的返回类型,而使用int会更好,因为yu总是返回int值:1510501005001000

这是根据以下提示更新value()方法的方法:

public static int value(String character){
    switch (character == "I"){
      case "I":
         return 1;             
      case "V":
         return 5;             
      case "X":
         return 10;             
      case "L":
         return 50;             
      case "C":
         return 100;             
      case "D":
         return 500;             
      case "M":
         return 1000;             
      default:
         return 0;
}

这样可以避免在代码中出现上述问题,您也可以通过changingthe类型of字符from字符to字符in your method as it will always hold a unique字符{{1}来更好地改进它} along with using Sting.charAt(i)`得到各自的字符。

答案 2 :(得分:0)

您应该使用equals而不是直接使用等号运算符==

除此之外,罗马数字代表整数。使用floating-point number (double is a floating-point number)代替,不是一个好习惯。

public class Roman
{
    public static void main(String[] args)
    {
        int total = 0;
        String romanString = "MCMLXXVIII";
        int difference = 0;


        while (romanString.length() > 0)
        {
            if (romanString.length() == 1 || value(romanString.substring(0, 1)) >= value(romanString.substring(1, 2)))
            {
                total = total + value(romanString.substring(0, 1));
                romanString = romanString.substring(1);
            } else
            {
                difference = value(romanString.substring(1, 2)) - value(romanString.substring(0, 1));
                total = total + difference;
                romanString = romanString.substring(1);

            }
            System.out.println(total);
        }

    }



    public static int value(String character)
    {
                      if (character.equals("I"))
                      return 1;

                      else if (character.equals("V"))
                      return 5;

                      else if (character.equals("X"))
                      return 10;

                      else if (character.equals("L"))
                      return 50;

                      else if (character.equals("C"))
                      return 100;

                      else if (character.equals("D"))
                      return 500;

                      else if (character.equals("M"))
                      return 1000;

                      return 0;
      }


}