Eclipse コレクションを使用する場合は、次のコードを記述できます。まず、指定した範囲を設定します。
private ImmutableList<Interval> ranges = Lists.immutable.with(
Interval.fromTo(0, 29),
Interval.fromTo(30, 39),
Interval.fromTo(40, 69),
Interval.fromTo(70, 100));
次に、匿名の内部クラスを使用して、これらの範囲を例で使用できます。
final MutableBag<Interval> countByRange = Bags.mutable.empty();
Interval inputs = Interval.from(5).to(100).by(5);
inputs.forEach(new IntProcedure()
{
public void value(final int grade)
{
countByRange.add(ranges.detect(new Predicate<Interval>()
{
public boolean accept(Interval range)
{
return range.contains(grade);
}
}));
}
});
countByRange.forEachWithOccurrences(new ObjectIntProcedure<Interval>()
{
public void value(Interval range, int occurrences)
{
System.out.println(range + " : " + StringIterate.repeat('*', occurrences));
}
});
Interval 入力を実際の入力 (例では Scanner) に置き換える必要があります。テストするための単純な入力セットが欲しかっただけです。
コードの出力は次のとおりです。
Interval from: 70 to: 100 step: 1 size: 31 : *******
Interval from: 40 to: 69 step: 1 size: 30 : ******
Interval from: 30 to: 39 step: 1 size: 10 : **
Interval from: 0 to: 29 step: 1 size: 30 : *****
Java 8 Lambda 構文を使用すると、次のように記述できます。
MutableBag<Interval> countByRange = Bags.mutable.empty();
Interval inputs = Interval.from(5).to(100).by(5);
inputs.forEach((int grade) -> {
countByRange.add(ranges.detect(range -> range.contains(grade)));
});
countByRange.forEachWithOccurrences((range, occurrences) ->
{System.out.println(range + " : " + StringIterate.repeat('*', occurrences));});
forEach を使用してバッグに追加する代わりに、collect を使用したい場合は、次のコードで同じ結果が得られます。
Interval.from(5).to(100).by(5)
.collect(grade -> ranges.detect(range -> range.contains(grade)))
.toBag()
.forEachWithOccurrences((range, occurrences) ->
{System.out.println(range + " : " + StringIterate.repeat('*', occurrences));});
注:私は Eclipse コレクションのコミッターです。