我有一个数字列表,例如1到60,但不一定是1的增量,例如1-40的增量,和40-60的增量2。
我有另一组定义的数字(桶)-e.g 2,3,5,10,30,50
我需要产生一个二维数组的百分比,每个数字从上面(1到60)适合哪个桶。
为了使这更简单:假设我们有数字1到10,和桶,2,3,5,10
我希望我的二维数组看起来像这样:

我可以用一堆条件来做这件事,但我认为有一个解决办法,我还没有想到,如果有人能给我一些启发,那就太好了!我需要在JavaScript中这样做,但是任何语言都会帮助我尝试和理解任何解决方案,而不是很多if决定每个数字适合的位置,然后对每个单元格执行(6-5/10-5)=0.2。
我试图避免硬编码桶,2,3,5,10,以便任何一组桶或数字可以完成这项工作。
编辑:首先,我很抱歉描述不完整--当时我在手机上,无法通过电脑在堆栈溢出上发帖子。
1-10和2,3,5,10都代表年份。实际上,我每年都在努力从1岁到10岁。
我希望这能让事情更清楚。
发布于 2014-09-16 20:40:40
你可以这样做。它把它按照你在帖子中要求的格式写成:
function bucketize(numberList, buckets) {
// buckets must contain values sorted from smallest to largest
var bucketized = [];
var i, j, lowBucket, difference, bucketSpan, ratio;
for (i=0; i<numberList.length; i++) {
bucketized[i]=new Array(buckets.length + 1);
bucketized[i][0]=numberList[i];
lowBucketIndex=null;
for (j=0; j<buckets.length; j++) {
if (lowBucketIndex === null && numberList[i] < buckets[j]) {
lowBucketIndex=j-1;
if (lowBucketIndex < 0) {
// this bucket gets it all
bucketized[i][j+1]=1;
} else {
//divide this value between buckets
difference = numberList[i] - buckets[lowBucketIndex];
bucketSpan = buckets[j] - buckets[lowBucketIndex];
ratio=difference/bucketSpan;
bucketized[i][lowBucketIndex+1] = 1-ratio;
bucketized[i][j+1] = ratio;
}
} else {
bucketized[i][j+1]=0;
}
}
if (lowBucketIndex === null) {
bucketized[i][buckets.length] = 1;
}
}
return bucketized;
}
var buckets = [2,3,5,10];
var numberList=[1,2,3,4,5,6,7,8,9,10];
var bucketized = bucketize(numberList, buckets);
var i;
for (i=0; i<bucketized.length; i++) {
console.log(bucketized[i].join(','));
}这是一个小提琴。
https://stackoverflow.com/questions/25844634
复制相似问题