3

私は現在、自分の割り当ての 1 つに取り組んでおり、関数の 1 つのロジックに関するヘルプを探しています。

まず、分類する数値の配列があり、次に数値間隔です。この数値は、プロットされている各数値が配列 2 に入る位置を決定します。

すなわち。

int interval = 2;

for(int i = 0; i < array1.length; i++) {
    if((array1[i] > 0) && (array1[i] < interval)) {
        array2[0]++;
    }
}

ただし、array1 の数値は 3 です。次のような別の if ステートメントが必要になります。

...
}else if((array1[i] > 2) && (array1[i] < interval * 2)) {
    array2[1]++;
}else if((array1[i] > 

これに関する問題を理解し始めることができるように、無限の範囲の数値に対して続行する必要があるということです。だから私の質問は、この目標を達成するためのより簡単な方法は何ですか? または、そのために利用できるライブラリがすでにありますか?

これを十分に明確にしなかった場合は申し訳ありません。また、コードが提供されていないことを希望します。誰かがこれを行うためのより効果的な方法を教えていただければ幸いです。事前に感謝します!

編集:

間隔が 2 に設定され、array1 の数値が 0 から 10 の間であると仮定すると、そのようなコードを作成する必要があります。

2 < numFromArray1 > 0 == array2[0]++
4 < numFromArray1 > 2 == array2[1]++
6 < numFromArray1 > 4 == array2[2]++
8 < numFromArray1 > 6 == array2[3]++
10 < numFromArray1 > 8 == array2[4]++

ただし、array1 の数値は、正または負、整数または 10 進数にすることができます。

4

5 に答える 5

7

ネストされたループを使用します。array2 のサイズは固定であるため、間隔の可能性が無限にあるわけではありません。したがって、array2 内のすべてのセルをループ処理してから、必要な条件を計算する場合... 完全なコードは提供しません (提供しないように求められましたが、次のようになります:

for ( ... ) {
    for ( ... ) { 
        if (array1[i] > /* do some math here */ && ... ) {
            array2[/* figure out what this should be too */]++;
        }
    }
 }

うまくいけば、あなたはこれからそれを理解することができます.

ところで、array2 に配列を使用する必要がない場合は、必要に応じてLinkedList<?>サイズを大きくできるデータ構造について学習することを検討してください。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/LinkedList.html

http://www.dreamincode.net/forums/topic/143089-linked-list-tutorial/

于 2012-10-25T18:29:47.823 に答える
2

質問が正しいことを理解し、間隔が3であると仮定すると、0、1、および2が発生するとarray2 [0]が増加し、3、4、および5が発生するとarray2[1]が増加します。解決:

編集申し訳ありませんが、あなたはコードを見たくありませんでした。必要に応じて、再投稿できます。番号がどのカテゴリに入るのかを判断するための本当に簡単な方法を考えてください。ヒントを提供しようと思います。

間隔=3;
0,1,2- >カテゴリ03,4,5->
カテゴリ
16,7,8->カテゴリ2

カテゴリがわかれば、array2で目的の数を簡単にインクリメントできます。

次のようになります。

for(int i = 0; i < array1.length; i++) {
    int category = // determine category here
    // increase correct position of array2
}

いくつかの議論の後、ここに私のコードがあります:

for(int i = 0; i < array1.length; i++) {
    int category = array1[i] / interval;
    array2[category]++;
}

私の解決策は負の数では機能しません。また、それらの処理方法も指定されていません

于 2012-10-25T18:31:38.600 に答える
2

すべてのケースを考慮するためにできることは次のとおりです。

  • まず、配列の最大値を調べます: - array1

  • あなたの範囲は0 to maxValueInArray1

  • 次に、外側の for ループ内で、 から0まで実行される別のループを作成できます(maximum value) / 2。なぜなら、あなたはmaximum value * 2あなたのinterval

  • そして、各値について、範囲を確認できます。その範囲内にある場合は、使用しますarray2[j]

EGの場合: -

for (...) // Outer loop {
    for (int j = 0; j <= maximumValueinArray1 / 2; j++) {
        // Make a range for each `j`
        // use the `array2[j]` to put value in appropriate range.
    }
}

内側のループでは、次の理由に基づいて、この状態を確認できます。

interval = 2の場合、たとえばmaximumValueinArray1ismaxの場合、範囲は次のようになります: -

  0 * interval ----- (1 * interval)  --> in `array2[0]` (0 to 2)
  1 * interval ----- (2 * interval)  --> in `array2[1]` (2 to 4)
  2 * interval ----- (3 * interval)  --> in `array2[2]` (4 to 6)

and so on.

 ((max / 2) - 1) * interval ----- (max / 2) * interval  (`max - 2` to max)

したがって、これらの条件を、私が投稿した内側のループと関連付けてみてください。そうすれば、問題は解決します。

于 2012-10-25T18:34:17.147 に答える
1

forあなたが何をしようとしているのか正確にはわかりませんが、コード スニペットから、次の内部ループを思いつくことができます。

//OUTDATED CODE - please see code block in EDIT below
//for(int i = 0; i < array1.length; i++) {
//    for (int j = 0; j < 100000; j++) { //or Integer.MAXVALUE or whatever
//        if ((array1[i] > (j*2)) && (array1[i] < interval * ((j*2)==0?2:(j*2)) )) {
//            array2[j]++;
//        }
//    }
//}

編集:最近の編集により、これはより適切であり、内部ループを実行する必要はありません!:

  1. array1 をループする
  2. array1 の各要素について、要素の下限 / 間隔を取得して array2 インデックスを見つけます。
  3. 見つかったインデックスの array2 要素に 1 を追加します。

以下のコードを見ないでください =)

for(int i = 0; i < array1.length; i++) {
    int index = Math.floor(array1[i] / interval);
    array2[index]++;

    //the rest are actually not necessary as you just need to get the index
    //and the element will be within range, left inclusive (lower <= value < upper)

    //int lower_range = Math.floor(array1[i] / interval) * interval;
    //    //or int lower_range = index * interval;
    //int upper_range = Math.ceil(array1[i] / interval) * interval;

    //if ((array1[i] > lower_range) && (array1[i] < upper_range)) {
    //    array2[index]++;
    //}
}
于 2012-10-25T18:27:59.483 に答える
0

関係とパターンを理解するのは難しいです。あなたが欲しいものを解釈する私の試み:

次のようなものはどうですか?

if ( array1[i] < interval * (interval - 2) ) {
    array2[interval-2]++;
}
于 2012-10-25T18:31:59.420 に答える