• ベストアンサー

数字の大小の比較とテストメソッド

JAVAを2週間前に始めたばかりの初心者です。課題をいくつか解いてるのですが、いきづまってしまいました。 String型の数をいくつか1つの変数で受け取り、その中から一番大きい数をreturnで返します。 流れとしては、例えば変数streamに"1.0 -2.0 7.5 -3.0 0.5"を受け取った場合、数字一つ一つに分解しstrに格納。 ここで数字はString型なのでdouble型に変えて大小の比較をしようと考えたのですが、 import java.util.Scanner; public class ControlFun {  public double maximInScanner(Scanner stream){ stream = new Scanner(System.in); String index = stream.nextLine(); StringTokenizer str = new StringTokenizer(index, " "); //strに数字を一つ一つに分解し格納  while(str.hasMoreTokens()) { double indexDou = Double.parseDouble(str.nextToken()); //indexDouにそれぞれの数字をdouble型に変更して格納 //ここからどうしたらいいかわかりません。比較したい数字(5つ)が全て同じ変数に格納されてるので、それをどうやったら比較して一番大きい数字(この場合7.5)を返せるのでしょうか? } } それとこれのテストメソッドも作りたいのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ControlFunTest { @Test public void testmaximInScanner(){ ControlFun myFuns = new ControlFun(); Scanner stream = new Scanner("1.0 -2.0 7.5 -3.0 0.5"); assertEquals(7.5, maximInScanner(stream), 1e-12); } } ここでわからないのはmaximInScannerに赤線のエラーがでることです。 maximInScanner(Scanner)が未定義とでるのですが、定義は上でしてると思うのですが・・・。 わたしのやり方は間違ってますでしょうか?どう組めばプログラムは動きますか?宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんな具合 public static void main(String args[]){ String index = "1.0 -2.0 7.5 -3.0 0.5"; StringTokenizer str = new StringTokenizer(index, " "); double resultDbl = Double.parseDouble(str.nextToken()); while(str.hasMoreTokens()) { double compareDbl = Double.parseDouble(str.nextToken()); if (resultDbl < compareDbl ){ resultDbl = compareDbl; } } System.out.println(resultDbl); } >ここでわからないのはmaximInScannerに赤線のエラーがでることです。 >maximInScanner(Scanner)が未定義とでるのですが、定義は上でしてると思うのですが・・・。 >わたしのやり方は間違ってますでしょうか?どう組めばプログラムは動きますか?宜しくお願いします。 どうみてもそんなメソッドないです。 public void testmaximInScanner(){ ←これのこと? 引数よく見てください。

lockwell
質問者

補足

あーなるほど。double resultDbl = Double.parseDouble(str.nextToken());と このように比較する対象を作るということですか。 ありがとうございます!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

上: 普通は「既にみた要素の中での最大値」を覚えておく変数を作ります. 今は文字列から値を取り出していますが, ここまでしないで「double の配列の中から最大値を見つける」ことはできますか? 下: 定義しているのは testmaximInScanner では?

lockwell
質問者

補足

早速の回答ありがとうございます。 下は解決しました。 assertEquals(7.5, myFuns.maximInScanner(stream), 1e-12); とするべきでしたね。 本体のプログラムですが、つまり stream = new Scanner(System.in); double index = stream.nextLine(); こう変えるということでしょうか?Stringにした理由は、"1.0 -2.0 7.5 -3.0 0.5"これらの数字を1つ1つに分解しないと比較できないのでString型でないと分解できないのでは、なんて思ったからです 問題にはString型のフロートの数字をScannerで受け取るみたいなことが書いてあるので・・・ 変数がいくつかあってそれぞれの変数の大小を比較するなら簡単なんですが、この場合変数が一つしかなく比較したい数字がすべてその変数に入っているので、どのように比較していいのかがわかりません

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テストメソッド

    テストメソッドを使いプログラムを実行させたいのですが、テストメソッドにエラーが出て正常にプログラムが動くかどうか調べられません。 問題は、配列0の数字を、int型のnumShiftsで与えられた数字の回数だけ一番後ろへ移動させ、それ以外の配列の数字を左へシフトさせます。 つまり、一度配列0の中身を一番後ろに持っていくと、配列1の数字が配列0にくるので、それをまた一番後ろにもって行きます。 そしたら配列2の数字が配列0に来ます。それをまた一番後ろにもって行きます。それをnumShifts回繰り返します。 例) ({1,2,3,4,5,6,7}, 3) 3回移動→ {4,5,6,7,1,2,3} ({1,2,3,4,5,6,7}, 0) 0回移動→ {1,2,3,4,5,6,7} ({1,2,3}, 5) 5回移動→ {3,1,2} プログラムは以下のように組みました。 public class ArrayFun { public void shiftNTimes(int[] array, int numShifts) { for (int i = 0; i < numShifts; i++) { //numShifts回繰り返す for (int j = 0; j < array.length-1; j++) { //配列をシフト int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } } テストメソッドは以下です。 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testshiftNTimes() { ArrayFun af = new ArrayFun(); int[] a1 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列 int[] a2 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列 int[] a3 = { 1, 2, 3 };//元の配列 int[] a4 = { 4, 5, 6, 7, 1, 2, 3 };//シフト後の配列 int[] a5 = { 1, 2, 3, 4, 5, 6, 7 };//シフト後の配列 int[] a6 = { 3, 1, 2 };//シフト後の配列 assertEquals(a4, af.shiftNTimes(a1, 3)); assertEquals(a5, af.shiftNTimes(a2, 0)); assertEquals(a6, af.shiftNTimes(a3, 5)); } } エラーは、assertEqualsに赤線が出てしまうことです。 このタイプのAssertでのassertEquals(Object, Object)は、(int[], void)に適切ではないと表示されます。 他のテストメソッドではこのようなエラーは出ないのですが・・・。どなたか解決方法をご存知であれば宜しくお願いします。

    • ベストアンサー
    • Java
  • JUnit4での日付の大小比較について

    JUnit4での日付の大小比較について /* 環境 */ JDK 6.0 Update17 eclipse 3.5 JUnit4.7 初めてJUnit4を使ってテストコードを書いてみようと思ったのですが、 日付の大小比較についての記述がわかりません。 例えば、次のコードでyourBirthdayがmyBirthdayよりも後の日付である(大きい)ことを確認するには どのように書いたらよいのでしょうか? import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; ... ... Date myBirthday = ... Date yourBirthday = ... assertThat(myBirthday, is(notNullValue()); assertThat(yourBirthday, is(notNullValue()); // yourBirthday > myBirthday であることを確認したい assertThat(yourBirthday, /* ??? */); ご教示よろしくお願いします。

    • ベストアンサー
    • Java
  • 入力文字列が数字かどうかの判別

    キーボードから入力した文字列が数字かどうかを判別したいのです。 入力した文字列が数字ではない間、またその逆の文字列が数字の間ループさせたいのです。 ループさせないやり方(Integer.parseInt(String)で数字でなければcatchで処理する)はわかるのですが・・・ import java.io.*; class Test{ public static void main(String[] args){ String str = ""; BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); try{ do { str = br.readLine(); System.out.print("\n"); }while(strが数字の間、もしくは数字以外の間) } catch(Exception e){ System.err.println(e); } } } 上のプログラムのwhileの中で判別したいのです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaでCSVの中身から最大値を表示したい

    タイトルの通りなのですが、javaのプログラムでCSVの中の少数を読み込み、そこから最大値を表示したいのです。 CSVの中身は 10.1,20.2,30.3,40.4,50.4 100.1,200.2,300.3,400.4 という半角の少数がカンマで区切られた状態になっています。 import java.util.Scanner; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class test { public static void main(String args[]) throws NumberFormatException, IOException{ System.out.println("csvのファイル名を入力"); Scanner sc = new Scanner(System.in); String str = sc.next(); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(str))); String line; while((line=br.readLine())!=null){ String[] sp = line.split(","); double sum=0;//合計値格納用 for(int i=0;i<sp.length;i++){ sum += Double.parseDouble(sp[i]); } System.out.println(line+"の合計値は"+sum); } br.close(); } } 上記のプログラムは、CSVの中身の各行の合計値を算出するもので、これを元に各行の最大値を算出したいのですが、どうしても比較演算子を使用しての算出がうまくいきません。 どなたかプログラムに詳しい方がいましたら、ご教授いただけると助かります。 つたない文章ですがよろしくお願いします。

    • ベストアンサー
    • Java
  • テストケースが上手くいきません。

    ソースを以下に示します。 package sample.hello; import java.io.File; import java.util.HashMap; /public class EmployeeMapFactory { private EmployeeMapFactory(){} private String directoryPath; public EmployeeMapFactory(String directoryPath) { this.directoryPath = directoryPath; } public EmployeeMap createEmployeeMap() { // 故意にテストを成功させるメソッドの実装 java.util.Map employeeMap = new HashMap(); File xmlFile = new File(directoryPath); Employee emp = new Employee("01","オープンソース 太郎","Manager","999888777"); employeeMap.put("01", emp); return new EmployeeMap(employeeMap); } } 次がテストを実行するためのソースです。 package sample.hello; import junit.framework.TestCase; import sample.hello.Employee; import sample.hello.EmployeeMap; import sample.hello.EmployeeMapFactory; public class EmployeeMapFactoryTest extends TestCase { /** * Constructor for EmployeeMapFactoryTest. * @param arg0 */ public EmployeeMapFactoryTest(String arg0) { super(arg0); } public void testCreateEmployeeMap() throws Exception { //このテストケースメソッドを記述していきます。 EmployeeMapFactory eFactory = new EmployeeMapFactory("employee.xml"); EmployeeMap eMap = eFactory.createEmployeeMap(); Employee e01 = eMap.getEmployee("01"); assertEquals("[01,オープンソース 太郎,Manager,999888777,null]", e01.toString()); } } どこが間違っているのか分かる方どうか教えて頂ければ、と思っています。

  • vectorを使った列の計算について

    への補足 列合計を計算したいのですが、 まったくといってどうすればいいのか思いつきません>< どのようにループすれば列合計を計算、出力できるのでしょうか? import java.util.*; import java.io.*; public class Gyosyukei { public static void main(String args[]) { try{ BufferedReader br = new BufferedReader(new FileReader(args[0])); String str; while((str = br.readLine()) != null){ // 1行を格納するVector Vector vcLine = new Vector(); StringTokenizer st = new StringTokenizer(str,","); for(int i =0;st.hasMoreTokens(); i++){ String token = st.nextToken(); // 行の要素に追加 vcLine.addElement(token); } /* 行合計 */ int gyosum = 0; int num = 0; for(int j =1; j < vcLine.size(); j++){ num = Integer.parseInt((String)vcLine.get(j)); gyosum += num; } System.out.println(gyosum); } } catch(IOException e){ } catch(ArrayIndexOutOfBoundsException ae){ } } }

    • ベストアンサー
    • Java
  • 引数の違うメソッド

    PHPで同名で引数の違うメソッドを作成したいのですが、可能でしょうか? <?php class Test { var $test_str = ""; function set($str){ $test_str = $str; //$this->$test_str = $str; // どちらでも良い? } function Test() { // 引数なし } function Test($str) { // 引数あり $this->set($str); } } $obj = new Test(); ?>

    • ベストアンサー
    • PHP
  • java練習

    import java.util.Scanner; class test { public static void main (String[ ] args) throws IOException { System.out.println("文章を入力してください。"); BufferedReader input = new BufferedReader (new InputStreamReader (System.in)); String str = input.readLine( ); if (str == A) { str ="10"; } else if (str == 64) { str ="100"; } else if (str == 3E8) { str ="1000"; } else if (str == FF) { str ="255"; } else if (str == 100) { str ="256"; } System.out.println(" str + "); } } 今プログラミングの練習で文字や数字を判別するプログラムを作っています。 とりあえず16進数を入力したら10進数に変換されるプログラムを書いてたんですけどコンパイルしたらどうしてもエラーが出てきてしまいます。 調べてもよくわかりません、助けてください。

  • 基本的な構文について

    いつも参考にさせて頂いています。 基本的なことなのですが、宜しくお願いします。 以下のBeanクラスがあるとします。 -------bean class public class Bean { private String str; public String getStr() { return str; } public String setStr(String str) { this.str = str; } } --------------- プロパティstrを取得してあるメソッドに引数として渡す場合、1と2ではどちらが適切でしょうか? 1. public class Test { Bean bean = new Bean(); String testStr = bean.getStr();   methodAAA( testStr ); } 2. public class Test { Bean bean = new Bean(); methodAAA( bean.getStr() ); } 1のほうが新しいオブジェクトを作成してしまうのでコストがかかってしまう気がするのですがいかがでしょうか。 methodAAA( bean.getStr(). … )と長くなる場合は一度違うオブジェクトに格納したほうがいいとか… 双方ともにメリットデメリットあるとは思いますが、噛み砕いて説明して頂けると助かります。

    • ベストアンサー
    • Java
  • Scanner と BufferedReader

    javaでキーボードからの入力を格納するやつがあって、 Scanner と BufferedReaderのやり方がありますが、これはどう違うのでしょうか? それとも全く同じでしょうか? たとえば、 ■一つ目 import java.io.*; class Sample3{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("文字列を入力してください"); String str1=br.readLine(); System.out.println("検索文字を入力してください"); String str2=br.readLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } ■二つ目 import java.util.Scanner; class Sample4{ public static void main(String[] args){ Scanner stdIn=new Scanner(System.in); System.out.println("文字列を入力してください"); String str1=stdIn.nextLine(); System.out.println("検索文字を入力してください"); String str2=stdIn.nextLine(); char ch=str2.charAt(0); int num=str1.indexOf(ch); if(num !=-1) System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました"); else System.out.println(str1+"に「"+ch+"」はありません"); } } これら2つは全く同じ実行結果が得られると思うのですが、 Scanner と BufferedReader の使い分けるべき場合などあるのでしょうか?

    • ベストアンサー
    • Java