2017-09-25 5 views
2

私はjavaを使い慣れていません。なぜ変数の合計が更新されないのか混乱しています。私はそれを印刷すると、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

これは、問題のデバッグ方法を学ぶのに最適な時期です。デバッガを使用するか、一時的なprintlnをコード全体に広範囲に振りかけて、実行中の変数が何であるかを確認してください。 –

+1

'value()'とは何ですか?あなたが開発した方法ですか? –

+0

このコードは不完全です。 'value()'関数はどこにありますか?最後の '}'も閉じられません。 – Arun

答えて

3

文字列オブジェクトであるので、私はあなたのvalue()方法であなたは、メモリアドレスを比較避けるために.equals()を使用しなければならないと思います。現在、==で、value()は、2つのメモリアドレスを比較しているので、常に0を返します。私は推測として

+0

あなたは正しいです!ありがとうございました! – Bugaboo

0

すべてのあなたの問題は、あなたのvalu()方法から来る、実際には最大の問題は、あなたが==代わりの.equals()と比較する文字列をARAことで、==比較はプリミティブ型で使用されます。

これらのすべての文の代わりにSwitch文を使用した場合、.equals()以上を使用した場合は、この問題を解決できます。 1510501005001000

もう一つは、湯が常にint値を返すされているとして、あなたがintを使用した場合より良いだろうが、あなたのvalue()メソッドの戻り値の型としてdoubleを使用したことです。

これはあなたの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 Char in your method as it will always hold a unique文字along with using Sting.charAt(i) `はそれぞれの文字を取得します。

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; 
     } 


} 
関連する問題