根据另一个数组确定一个数组的值

3

我目前正在处理我的一个作业,并需要在其中一个函数的逻辑上寻求帮助。

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

例如:

int interval = 2;

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

然而,数组1中的数字是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]++

然而,数组1中的数字可以是正数或负数,整数或小数。

你的数字 number 可以有多大。同时,你失去了条件:- array1[i] == interval - Rohit Jain
我不明白问题所在。你能发一份更详细的解释吗?提供一个示例运行?另外,“number number”是什么意思? - Konstantin Tarashchanskiy
我的意思是:array1 = 要分类的数字集合number = 3 将从array1中随机选择一个数字。 - Matthew Brzezinski
我在原帖底部添加了另一个示例。 - Matthew Brzezinski
@user1327636,看看我的答案,可以避免不必要的内部循环。此外,jlordo是正确的,我的解决方案将丢弃恰好为4、恰好为6等等。你可以通过决定它应该属于哪个类别,然后将正确的条件从>或<更改为>=或<=来避免这种情况。 - ADTC
显示剩余4条评论
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/

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]++;
}

我的解决方案无法处理负数。而且并没有说明如何处理它们。


我觉得我已经通过你的方法弄清楚了,如果我错了,请纠正我。如果间隔大小为2,并且我有一个从1到10的数字数组。我会这样做:array1[i] / interval = category - 1; - Matthew Brzezinski
那就是我所想的,只是懒得写成正确的代码形式。我会减一,因为这样可以给出正确的类别,因为数组从第0个元素开始,而不是第一个。 所以,假设像之前的例子一样,间隔为2,数字从1-101/2 = 0.5 == 类别0 2/2 = 1 == 类别0 3/2 = 1.5 == 类别1因为当除以间隔时,类别0将是一个数字,该数字等于介于0和1之间,类别1是任何被除以间隔位于1和2之间的数字。 - Matthew Brzezinski
@jlordo。这个条件怎么样:- 4 < numFromArray1 > 2 == array2[1]++??它匹配吗?你已经把5包含进去了。 - Rohit Jain
在Java中,@user 1/2 = 0.5,但是如果1和2都是整数,则结果为0。因此,减去1会导致-1,这显然会导致ArrayIndexOutOfBoundsException。同样,在Java中,3/2等于1,正好是您想要的索引。 - jlordo
你是正确的,我已经为此编写了一个小示例,但我遇到了一个错误,因为 2 / interval (2) = 1 并且它会增加 array2 [1] 的值,而应该增加的是 array2 [0] 的值。我该如何设置才能使其递增到正确的类别?(如果您愿意,请在此处发布代码) - Matthew Brzezinski
显示剩余7条评论

2

以下是考虑所有情况的方法:

  • 首先找出数组 array1 中的 最大值

  • 您的范围应该是 0 到 maxValueInArray1

  • 然后在外部 for 循环内部,您可以再添加一个循环,它将从 0 运行到 (maximum value) / 2。因为您不想在 interval 中检查 maximum value * 2

  • 然后对于每个值,您都可以检查其是否在该范围内,并使用 array2[j]

例如:

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,假设Array1中的maximumValueinmax,您的范围如下:

  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)

因此,尝试将这些条件与我发布的内部循环相关联,您的问题将得到解决。


@user1327636,请看一下这个答案。我认为你会明白你应该做什么。 - Rohit Jain

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. 遍历数组1
  2. 对于数组1中的每个元素,通过取元素/间隔的floor值来找到数组2的索引
  3. 在找到的索引处将数组2的元素加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]++;
    //}
}

是的,我没有注意到 :( 由于他的片段不清楚数学部分应该是什么,所以我的代码可能有误。他只给了两种情况,很难从中判断模式。 - ADTC
另外,你的条件不正确。你应该用间隔乘以j而不是2。 - Rohit Jain
就像我之前所说的,这个问题没有明确说明这个模式是什么。我只是猜测了一下模式。你可能是对的,但原始提问者需要确认。 - ADTC
@ADTC。我更喜欢不要给我代码。-> 这是OP在帖子中的某个地方写的。 - Rohit Jain
@ADTC,这几乎就是我的答案。另外,Math.floor()返回一个double类型的值,你无法将其赋值给int类型的变量 ;) - jlordo
显示剩余5条评论

0

关系和模式很难理解。我试图解释你想要的:

要不这样怎么样:

if ( array1[i] < interval * (interval - 2) ) {
    array2[interval-2]++;
}

如果你的条件失败了,你会增加数组2中的哪个元素? - jlordo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接