我需要将数字分成大小相似的块。我有两个变量 ,分别是数量和所需的单独块的数量。
例如,如果我想将120分成5个块,则好的输出可能是:0-24、25-49、50-74、75-99、100-120。
块的大小不必完全相同,如果它们相似也可以,但它们必须完全分开,即两个块中不能有数字。
我已经检查了其他答案,例如this,但它们并没有完全分开,因此无法使用。
这是我的Java代码:
int maxIndex = 10;
int numberOfChunks= 5;
int chunkSize =new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();
int counter=0;
for (int i=0; i<numberOfChunks;i++) {
int min = counter;
int max = counter+chunkSize;
if (i==numberOfChunks-1) max=maxIndex;
counter+=chunkSize+1;
System.out.println(min + " - " + max);
}
由于该数字为“ +1”,因此不适用于小数字。 错误输出的示例是:
0-2
3-5
6-8
9-11
12-10
有什么想法吗?
答案 0 :(得分:1)
假设我正确阅读了您的问题,并且有效的块列表为{0-1、2-3、4-5、6-7、8-10},我想您可以使用一些小的修改。像这样:
int maxIndex = 10;
int numberOfChunks= 5;
int chunkSize =new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();
int counter = 0;
for (int i = 0; i < numberOfChunks; i++) {
int min = counter;
int max = counter + chunkSize - 1;
if (i == numberOfChunks - 1) {
max = maxIndex;
}
counter += chunkSize;
System.out.println(min + " - " + max);
}
答案 1 :(得分:1)
按原样使用chunkSize
,就不算0
。这意味着您在初始化最大值时应减去一个。
int maxIndex = 10;
int numberOfChunks= 5;
int chunkSize =new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();
int counter=0;
for (int i=0; i<numberOfChunks;i++) {
int min = counter;
int max = counter+chunkSize-1;
if (i==numberOfChunks-1) max=maxIndex;
counter+=chunkSize; //Get rid of the +1
System.out.println(min + " - " + max);
}
答案 2 :(得分:0)
一种已评论的解决方案,明确使用最多2个相距1的块大小:
int count = maxIndex+1; // actual number of values to distribute
int size = new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue(); // minimum amount to put in each range
int extra = count - size*numberOfChunks; // values left after minimums used
int i = 0; // start of current range
while (i <= maxIndex) {
int j = i+size; // end of current range, assuming an extra is included
if ( extra > 0 ):
extra -= 1; // we've used one of our extras
else:
j -= 1; // "remove" the extra we optimistically included
System.out.println(i + " - " + j);
i = j+1; // start next range just after this one
}