首页 > 解决方案 > 如何从两个创建一个新数组并根据原始数组中的值初始化新数组

问题描述

我是 Java 新手,我不确定如何提出正确的问题,所以请多多包涵。我有 6 种不同类型的 40 个项目要放入一个新数组中;每种物品类型都有不同的成本。第一项(数量=1)每件价格为 3 美元,第二项(数量=2)每件价格为 5 美元,第三件(数量=4)每件价格为 9 美元,依此类推。每种项目类型的数量为 in numTypeIndArray,每种类型的成本为 in costCSDriverArray。总项目的累积计数在 中numTypeCumulArray

因此,新数组 ,indItemCostArray应该是一维的并且有 40 个元素。它看起来像{3,5,5,9,9,9,9,...,13,13,13},但最后 15 个元素的成本为 13 美元。如何获得这个包含 40 个元素的数组?我开始尝试使用嵌套的 for 循环填充数组,但我还没有到达那里。下面的代码是完全错误的。

int[] costArray = new int[]{3,5,9,10,11,13};
int[] numTypeIndArray = new int[]{1,2,4,7,11,15};
int[] numTypeCumulArray = new int[]{1,3,7,14,25,40};

int[] indItemCostArray = new int[numTypeCumulArray[6]];

for (int i = 0; i < indItemCostArray.length; i++) {
    for (int j = 0; j < numTypeIndArray[i]; j++) {
        indItemCostArray[i+j] = costArray[j];
    }
}

标签: javaarrays

解决方案


首先,你会得到一个ArrayOutOfBoundException

int[] indItemCostArray = new int[numTypeCumulArray[6]];

数组的大小numTypeCumulArray为 6,数组索引为 0。所以,最后一个索引号是 5,而不是 6,因为索引是从 0 开始的。

您可以执行以下操作来访问数组的最后一个元素:

int[] indItemCostArray = new int[numTypeCumulArray[numTypeCumulArray.length - 1]];

其次,您正在运行外循环40多次,并且对于每次迭代,您的内循环都尝试迭代numTypeIndArray[i]多次,其中i外循环的迭代器变量是。因此,肯定在第六次迭代之后,当值为iwill时6,您的程序将再次抛出 ,ArrayOutOfBoundException因为您正在访问内部循环的终止条件中的numTypeIndArray最后一个索引为 5 的值。

同样,在内部循环中,您indItemCostArray在索引位置进行分配i+j,这实际上与您的目的相去甚远。

要实现您所期望的,您可以执行以下操作:

int currentIndex =0;

for (int costIndex = 0; costIndex < costArray.length; costIndex++) {
    for(int index = currentIndex;  index < currentIndex + numTypeIndArray[costIndex]; index++) {
        indItemCostArray[index] = costArray[costIndex];
    }
    currentIndex = numTypeCumulArray[costIndex];
}

在这里,我所做的是,在外循环中,我迭代了相同的时间长度costArray,你也可以取长度numTypeIndArray,没问题。我已经定义了一个名为的变量currentIndex来跟踪 array 的当前可分配索引indItemCostArray。在内部循环中,我尝试从currentIndexand 循环开始,直到与该类型所需的项目数相同的时间,在 中给出,并且对于每次迭代,使用 中的成本numTypeIndArray[costIndex]设置相应的索引。最后,我使用来自.indItemCostArraycostIndexcostArraynumTypeCumulArray

希望你把一切都弄清楚了。


推荐阅读