3

我目前正在处理我的一项任务,并且正在为我的一项功能的逻辑寻求一些帮助。

首先,我有一个要分类的数字数组,然后是一个数字间隔,这个数字决定了每个被绘制的数字在哪个位置进入 array2。

IE。

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 中的数字可以是正数或负数、整数或小数。

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 -> 类别 0
3,4,5 -> 类别 1
6,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,说maximumValueinArray1max,你的范围看起来像: -

  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. 在找到的索引处将 1 添加到 array2 元素。

不要看下面的代码=)

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 回答