2013-12-24 5 views
1

У меня есть массив оценок и вы хотите создать подсчет для разных интервалов оценки. Это работает, но кажется утомительным, чтобы напечатать, если было больше категорий для тестирования.Как эффективно обрабатывать данные

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

Есть ли другой способ сделать это?

+1

Вы видите шаблон, который преобразует диапазон в индекс? –

+0

Но что, если диапазоны не были согласованными интервалами и были вместо 0-9, 10-13, 14-19? –

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

Crowed is wiled это один отсюда ...: P – Ljubisa

0

Поскольку в индексе и значении оценки есть шаблон, мы можем легко вычислить его с помощью одного утверждения. Попробуйте это:

for (int x: grades){ 
     int y = x/10; 
     tally[y] += 1; 
    } 
0

гуавы-х 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(); 
} 
Смежные вопросы