Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

実行しても思った結果になりません

Java初心者です。
テキストファイルから一行ずつDouble配列に格納し、一つの注目した要素の前後約100のどの要素よりも大きい値を見つけるプログラムを作りたいです。http://chaos-fractal.blogspot.com/2012/09/java-1.htmlを参考にして、テキストファイルからString配列に格納することはできています。
その後Double型に変換し、前後100程度の配列を作ってその最大値を求め、比較し、大きければ1.0、そうでなければ0.0を再代入しています。
詳しいことは以下のソースコードをご覧ください。
コンパイルエラーなどなく、実行はできますが結果は元々の数値がでてしまい、0.0や1.0は出てきません。

ソースコード
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;


public class maxwhere 
{

    public static void main(String[] args)
    {
        //テキストファイルからString型配列に一行ずつ格納
        String[] strarray = new String[60000];
        int i = 0;
        try
        {
            File file = new File("sampledata.txt");
            BufferedReader br = new BufferedReader(new FileReader(file));
            String str= null;
            i=0;
            while((str = br.readLine()) != null)
            {
                System.out.println(str);
                strarray[i]=str;
                i = i +1;
            }
            br.close();
        }
        catch(FileNotFoundException e)
        {
            System.out.println(e);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
        
        //String型配列をDouble型配列に変換
        double[] gain = new double[strarray.length];
        for (int i1 = 0;i1 < strarray.length; i1++)
        {
            gain[i1] = Double.parseDouble(strarray[i1]);
        }
        //ピーク検出
        
        for (int i1 = 0; i1 < gain.length; i1++) 
        {
            //前後の配列
            double[] firstGains = Arrays.copyOfRange(gain,i1, i1 + 100);
            double[] secondGains = Arrays.copyOfRange(gain, i+101, i1+200);
            //前後の配列の最大値
            double firstMax = firstGains [0];
            double secondMax = secondGains [0];
            for (int i11 = 1; i11 < firstGains.length; i11++) 
            {
                firstMax = firstGains[i11];
            }
            for (int i11 = 1; i11 < secondGains.length; i11++) 
            {
                secondMax = secondGains[i11];
            }
            //比較
            if(gain[i1 + 100] > firstMax && gain[i1 + 100] > secondMax && gain[i1 + 100] > 0.15)
            {
                gain[i] = 1.0;
            }
            else {
                gain[i] = 0.0;
            }
        }
        //出力
        for (int i1 = 0; i < gain.length; i++) {
            System.out.println(gain[i1]);
        }
    }    
}

面倒くさい質問ですが、なにとぞご教授お願い致します。

2

回答

75063

閲覧

2件の回答

評価

0

>Java初心者です。
これは余計。

プログラムは思ったとおり動くものではなく、書いてあるとおりに動くもの、と良く言われる。
期待する動きと実際の動きが違う場合、どこかに間違い(バグ)がある。
その間違いを見つけ出す(デバッグ)のも、基本的には作る人間の仕事だ。
どうしても見つけられないなら人に頼るしかないが、それは「質問」ではなく代行依頼だ。

まず考えることは、要所要所で鍵となる変数の値や分岐・ループがうまくいっているか(比較条件だったり、そのブロック内に来ているかだったり)を、目に見える形にしてみること。
古典的にはダミーのSystem.out.println()を挟んでみる。Eclipseなんかを使っているなら環境自体に一時停止や変数値の確認機能がある。
作るだけでなく、デバッグでもまずは自分の手を動かしてみよう。

評価

0

質問者です。
ありがとうございました、回答内容を参考にし、自分なりにデバッグした結果どの辺で事故ってるのかは分かりましたので色々試してみることにします。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。