1

整数の配列リストがあります。ボタンをクリックすると、テキスト フィールドのデータが変換され、配列リストに int として追加されます。以下はそのための私のコードです

public void onClick(View v) {
            // TODO Auto-generated method stub

            String rate = happy.getText().toString();
            int rating = Integer.valueOf(rate);
            counter += 1;

            if (counter == 10) {
                train();
            }

            if (rating > 0 && rating < 11) {
                happyRating.add(rating);

                test = happyRating.get(0);
                Log.d("Value: ", Integer.toString(test));

            } else {

                InputAlertHandler.post(new Runnable() {
                    public void run() {
                        int duration = Toast.LENGTH_LONG;
                        CharSequence text = "Please enter Happiness Indicator between 1 and 10";
                        Context context = getApplicationContext();
                        inputAlert = Toast
                                .makeText(context, text, duration);
                        inputAlert.show();
                    }
                });
            }
        }

関数 train(); で この配列リストからデータを取得し、計算に使用しています。

public void train() {

    for (int i = 2; i < 12; i++) {

        if (happyRating.get(i - 1) < happyRating.size()){

            int x, x1, x2, y, y1, y2;
            double learningRate = -0.00002;

            x1 = happyRating.get(i - 1);
            x2 = happyRating.get(i - 2);
            y1 = iteration[i - 1];
            y2 = iteration[i - 2];

            x = x2 - x1;
            y = y2 - y1;

            if (x == 0) {
                slope = 0;
            } else {
                slope = (y2 - y1) / (x2 - x1);
            }
            j++;

            Log.d("J: ", Integer.toString(j));

            double weightAdj = happyRating.get(j) * slope * learningRate;

            weighting = (weighting + weightAdj);

            Log.d("WEIGHTING: ", Double.toString(weighting));// break;

        }
        else
        {
            break;
        }

    }

計算に勾配を使用しているため、前の 2 つの点の勾配を取得しているため、for ループで int i = 2 を設定しています。

Index out of bounds 例外が発生しないようにチェックを入れました。私の問題は、J も WEIGHTING も logcat に表示されないことです。これは、それらが計算されていないことを意味するのか、それとも私にはわかりませんが、2つのグローバルとして初期化されているため、少なくともその値が出力されるはずですか? できるだけ早くこれを理解する必要があるので、これに光を当てることができる誰かがそこにいるなら、それは簡単なことだと確信していますが、私はこのプロジェクトを長い間見ていて目が痛い!!!

ありがとう!

4

2 に答える 2

0

それ以外の

      Log.d("WEIGHTING: ", Double.toString(weighting));// break;

logcat コンソールでキーワードを宣言します。たとえば、「output」と次のように書き込みます。

     Log.d("output","WEIGHTING: "+Double.toString(weighting));// break;

Log の最初のパラメーター。logcat 出力のキーワードである必要があります。

編集

Logcat は問題ではないようです。したがって、問題は for ループにあります。あなたの happyRating が確実に 10 の場合、次のことが起こります。

        for (int i = 2; i < 12; i++) {

    if (happyRating.get(i - 1) < happyRating.size()){

i が 11 に達すると、アイテム番号を取得しようとします。happyRating から 10 (サブ 1 のため)。しかし、何もありません。最大はアイテム番号です。9 (Java は 0 からカウントしているため)。ここで到達できる最大サイズは 9 です。したがって、for ループを 12 回実行する必要がある場合は、別の方法を試す必要があります。

編集

申し訳ありませんが、今のところコードをテストすることはできません。エラーがある場合は、反対票を投じないでください。家にいるときにテストします。しかし、これもうまくいくはずです...

    public void train() {

for (int i = 0; i < happyRating.size()-1; i++) {

    if (happyRating.get(i) < happyRating.size()){

        int x, x1, x2, y, y1, y2;
        double learningRate = -0.00002;

        x1 = happyRating.get(i+1);
        x2 = happyRating.get(i);
        y1 = iteration[i+1];
        y2 = iteration[i];

        x = x2 - x1;
        y = y2 - y1;

        if (x == 0) {
            slope = 0;
        } else {
            slope = (y2 - y1) / (x2 - x1);
        }
        j++;

        Log.d("J: ", Integer.toString(j));

        double weightAdj = happyRating.get(j) * slope * learningRate;

        weighting = (weighting + weightAdj);

        Log.d("WEIGHTING: ", Double.toString(weighting));// break;

    }
    else
    {
        break;
    }

}

あなたのコードのこの変更では、for ループは happyRating が最大サイズ -2 に達するまで反復するだけです。最初。これとあなたのコードの違いは、最後の値を例外なく取得できることです。あなたのコードでは、ループが maximum-1 に達すると、存在しない happyRating のアイテムを取得しようとします。たとえば、整数「i」の値が 10 であるとします。これがコードの動作です。

        x1 = happyRating.get(i - 1);//x1 = happyRating.get(9)
        x2 = happyRating.get(i - 2);//x2 = happyRating.get(8)
        y1 = iteration[i - 1];//y1 = iteration[9]
        y2 = iteration[i - 2];//y2 = iteration[8]

あなたの happyRating サイズが最大 9 の場合、x1 はそこにない値を持ちたいと考えています。ArrayList (または配列) のサイズは項目番号とは異なります。このサイズが 9 の場合、Java/Android は 0 からカウントするため、最後の項目の番号は 8 です。したがって、項目番号 9 を取得することはできません。for ループは、"i" が happyRating.size よりも小さい限り繰り返します。 (). happyRating.size() が 9 の場合、「i」は 8 まで繰り返し、その後繰り返しを終了します。happyRating.size() が 9 の場合、コードを変更すると次のようになります。

         x1 = happyRating.get(i+1);//x1=happyRating.get(8)
         x2 = happyRating.get(i);//x2=happyRating.get(7)
         y1 = iteration[i+1];//y1=iteration[8]
         y2 = iteration[i];//y2=iteration[7]

-> i が happyRating,size()-1 よりも小さい限り反復する (より小さいとは最大 8 を意味します --> -1 は 7 を意味します)。

于 2013-04-22T11:05:15.780 に答える
-1

これはうまくいくはずです:

Log.d("J: ", "" + j);

Log.d("WEIGHTING: ", "" + Double.toString(weighting));

于 2013-04-22T11:10:30.930 に答える