如何有效地计算数据

时间:2013-12-24 05:24:25

标签: java arrays

我有一系列成绩,并希望为不同的成绩间隔创建一个计数。 这样可行,但如果有更多类别需要测试,则输入似乎很乏味。

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

还有其他办法吗?

3 个答案:

答案 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的Ranges在这里提供了一个很酷的通用解决方案。

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();
}