2

ユーザーが入力したいくつかの数字を追加し、それらを配列リストに追加しています。

これまでの私のコード:

package project143;

import java.util.*;

/**
 * @author --
 */
public class Histogram {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        // Input for grades
        int mark = 0;
        List<Integer> list = new ArrayList<Integer>();
        while (mark >= 0 && mark <= 100) {
            System.out.println("Enter students mark:");
            mark = input.nextInt();

            if (mark >= 0 && mark <= 100) {
                list.add(mark);
            }

        }
        System.out.println(list);
    }
}

listここで、次の範囲 (0-29 、30-39 、40-69 、70-100) 内にある数字の数を数える必要があります。

各範囲内にいくつの数字があるかがわかったら、各範囲の横に " " を表示する必要があります。たとえば、0 ~ 29 の範囲内に 10 個の数字があるため、10 個の星を表示する必要があります (** * )。

どうすればこれを達成できますか?

4

4 に答える 4

6

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 コレクションのコミッターです。

于 2012-12-05T16:26:15.890 に答える
0

- 4 つの変数を使用して 4 つの範囲intを格納します。

例えば:

int range29;
int range39;
int range69;
int range100;

- Loopを介して、さまざまな範囲のエントリ数Listをカウントします。

例えば:

for(int i : list){

    if ( i>=0 & i<=29){   // better use Non-short circuit AND

          ++range29;
    }

  else if ( i>=30 & i<=39){   // better use Non-short circuit AND

          ++range39;
    }

  else if ( i>=40 & i<=69){   // better use Non-short circuit AND

          ++range69;
    }

  else if ( i>=70 & i<=100){   // better use Non-short circuit AND

          ++range100;
    }


}

-for-loop次に、aを使用して、範囲変数に従って星の数を出力します。

于 2012-12-02T14:40:06.207 に答える