2011-08-07 10 views
1

私は、ユーザーがローマ数字を1から10の間で入力し、それと同等の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 ; 
    } 
} 
+9

ヒント:文字列比較を正しく行う方法を調べます。 – Howard

+1

別のヒント:同じエラーがX回前後に繰り返されます:) –

+0

「動作しません」は問題の適切な説明ではありません。 –

答えて

4

2点:

  • =はそれが意志としてあなたは、とにかく文字列の等価性をテストするために==を使用すべきではありません代入演算子はなく、平等テスト演算子(==
  • ですの参照のみの同等性をテストします。 equalsを使用して、2つの文字列リファレンスがと等しく、(潜在的に異なる文字列オブジェクト)を参照しているかどうかをテストします。

また、あなたは

+0

私はどのようにメソッドを呼び出しますか?申し訳ありませんがまだ新入生です。ありがとう。 :) – Gen

+0

@ジェン:方法を呼び出す方法を学んでいないなら、本当に本に戻る必要があります - スタックオーバーフローは特定の質問には最適ですが、ゼロから学ぶのには適していません。あなたは 'Integer.parseInt'メソッドを代わりに' getRoman'の呼び出しに変更することができます。 –

+0

getRoman(val); getRomanのシグネチャをgetRoman(String val)に変更します。また、あなたはparseIntを必要としません。 – stivlo

0

あなたはすべてのエラーを取得している... intあなたもgetRomanを呼び出していないようString変数を返すようにしようとしていますか?

コードでは、決してgetRoman関数を呼び出すことはありません。また、たとえば、比較演算子 "I" .equals(val)の代わりに代入演算子=を使用しています。

+0

私はどのようにメソッドを呼び出しますか?申し訳ありませんがまだ新入生です。ありがとう。 :) – Gen

0

文字列comparsionはequals(String str)方法の代わり==比較して行われるべきです。 PS。とにかく==の代わりに=があります。

1

I)は、(我々はequalsを使って文字列を比較するための正しい方法があることを伝えることができると思います。

あなたは文字列にequalsメソッドを比較するために、==を使用するようにしましたプリミティブ型を比較す​​るために、割り当てをやっています。

例:

(val.equals( "I"))であれば

しかし、また、valが法getRoman()には存在しません。

1

valをintとして解析しようとしていますが、それはその文字ではありません。文字のような小さなサンプルについて

、その、おそらく最も簡単には、単に、char型のインデックス、それをルックアップテーブルを作成します。あなたがここで何をしたいのか明確にないある

val = "I" 

0

次の文は、代入です。

比較が(==)ダブル等号で行われますが、二重の等号される参照を比較していますが、ここでもそれを行うにはしたくありません。

equalsメソッドを使用します。

これらの変更をすべての場所で行い、どのように動作するかを確認します。

0

実際にあなたの主な問題は文字列比較から来ます。 javaでは、=は変数に値を代入することを意味し、==はプリミティブ型の値を比較することを意味し、equalsはオブジェクト(特に文字列)を比較する方法です。

equalsを使用する代わりに、JDK内部の文字列プールを使用できます。この場合、==をコンパレータとして使用できます。

ローマン言語の数値を解析する場合、ハッシュマップを使用して解析された数値の値を効果的に格納および取得することも検討できます。このような比較が数千回ある場合は、identityhashmapに行きます。

最後に、最初のものだけでなく、すべてのローマ数字について実際の解析を行いたい場合は、オートマトン、つまり状態機械を使用して数字をやや再帰的に解析することを検討する必要があります。あなたの問題に適用するより効率的なモデル。

最後の2つのコメントは、ソフトウェアアルゴリズムに対してより重視されています。最初の2つのコメントは、Java構文に対してより重視されています。より高いレベルの最適化を行う前に、構文を理解しておく必要があります。例えば、

if (val.equals("VII")) 

あなたも提供する必要がある - ほかに、あなたの文字列の比較は(...)関数のequalsを使うべきかについての上に言われたことから

よろしく、 ステファン

0

getRomanという関数の戻り値。この関数は、呼び出し元に整数値を返す関数として宣言されていますが、指定した実装では戻り値はありません(System.out.println(...)のみ)。

また、正しいパラメータ型を入力していない場合、関数は文字列をチェックして特定のローマ数字であるかどうかを調べます。だから、正しい関数ヘッダーは次のようになります。

public static int getRoman(String val) 

をまた、メイン()あなたが実際にこの関数を呼び出していることを確認してください - それは今どのように見えるか、あなたもgetRomanを使用していないから( ) 関数。

希望すると便利です。

関連する問題