我有一系列成绩,并希望为不同的成绩间隔创建一个计数。 这样可行,但如果有更多类别需要测试,则输入似乎很乏味。
for (int x: grades){
if (x < 10) {
tally[0] += 1;
} else if (x < 20) {
tally[1] += 1;
} else if (x < 30) {
tally[2] += 1;
} else if (x < 40) {
tally[3] += 1;
} else if (x < 50) {
tally[4] += 1;
} else if (x < 60) {
tally[5] += 1;
} else if (x < 70) {
tally[6] += 1;
} else if (x < 80) {
tally[7] += 1;
} else if (x < 90) {
tally[8] += 1;
} else if (x < 100) {
tally[9] += 1;
}
}
}
还有其他办法吗?
答案 0 :(得分:4)
对于任何间隔,伪代码都是
int intervals[11]={0,10,20,30,40,50,60,70,80,90};
for(int i=1; i<11; i++)
{
if(x>=intervals[i-1] && x<intervals[i])
tally[i-1]+=1;
}
但如果它们那么简单(10的倍数):
for(int i=1; i<11; i++)
{
if(x>=(i-1)*10 && x<i*10)
tally[i-1]+=1;
}
@Edit 或者实际上你可以:
int intervals[10]={10,20,30,40,50,60,70,80,90};
for(int i=0; i<10; i++)
{
if(x<intervals[i])
{tally[i]+=1; break;}
}
答案 1 :(得分:0)
由于索引和等级值中存在模式,我们可以使用单个语句轻松计算它。 试试这个:
for (int x: grades){
int y = x / 10;
tally[y] += 1;
}
答案 2 :(得分:0)
Guava的Range
s在这里提供了一个很酷的通用解决方案。
List<Range<Integer>> ranges = ImmutableList.of(
Range.openClosed(0, 10),
Range.openClosed(10, 20),
// ...
);
RangeMap<Integer, AtomicInteger> counts = TreeRangeMap.create();
for (Range<Integer> range : ranges) {
counts.put(range, new AtomicInteger(0));
}
for (int grade : grades) {
counts.get(grade).increment();
}