こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

度数分布図の棒グラフを「*」でコンソール出力

こんにちは。「Javaを復習する初心者」です。点数とその度数が与えられときに、コンソールに度数分布図を「*」で出力してみました。グラフは横向きです。

点数の範囲は0~ 9点、10~19点、・・・、90~99点、100点とします。それぞれに人数が設定されている場合に、その度数分布図をコンソールに出力してみようということです。

点数はランダムに1000件用意します。

処理の流れ

全体の処理の流れは以下の通りです。

  1. 点数をランダムで格納する。
  2. 点数を以下の区分で集計する。
    0~ 9点、10~19点、・・・、90~99点、100点

  3. 以下の定義で出力
    出力する行のフォーマット
    [ラベル]:[人数]:[*のグラフ]
    出力するラベル
    以下を右詰めで出力

    1. 0~ 9点
    2. 10~19点
    3. 20~29点
    4. 30~39点
    5. 40~49点
    6. 50~59点
    7. 60~69点
    8. 70~79点
    9. 80~89点
    10. 90~99点
    11. 100点
    出力する人数
    半角数字4桁のフィールドで「○人」
    *のグラフ
    条件 出力内容
    0人の場合 出力なし
    1人以上、10人未満の場合 「*」を1個出力
    10人以上の場合 「*」を「割る10したもの + 1」個出力

点数をランダムで格納するにはRandomクラスを使いました。[インスタンス].nextInt(101)で101未満の整数をランダムに得ることができます。1000個の要素からなるint型配列に格納しました。

集計では11個の要素からなるint型配列を定義しました。点数を11区分にするからです。点数pointに対してpoint / 10が格納する先の要素番号になります。for文で点数を走査し対象を加算しています。

出力では書式文字列「”%s:%4d人:%s”」を使いました。順番に、ラベル、人数、グラフです。グラフの生成はメソッドにしました。人数を引数にし、*の文字列を返却します。if文で処理を分岐し、*の長さを調整してます。

プログラム

以下はソースと実行結果です。

package practice;

import java.util.Random;

public class Hello20160802 {

    public static void main(String[] args) {

        // 点数をランダムで格納
        int[] points = new int[1000];
        Random random = new Random();
        for (int i = 0; i < points.length; i++) {
            points[i] = random.nextInt(101);
        }

        // 集計
        int[] counts = new int[11];
        for (int point : points) {
            counts[ point / 10 ] ++;
        }

        // 出力
        String[] labels = {
                " 0~ 9点",
                "10~19点",
                "20~29点",
                "30~39点",
                "40~49点",
                "50~59点",
                "60~69点",
                "70~79点",
                "80~89点",
                "90~99点",
                "   100点",
        };
        for (int i = 0; i < counts.length; i++) {
            System.out.printf("%s:%4d人:%s", labels[i], counts[i], graphOf(counts[i]));
            System.out.println();
        }

    }

    private static String graphOf(int count) {

        StringBuilder sb = new StringBuilder();

        int length = 0;
        if (0 < count && count < 10) {
            // 1人以上、10人未満の場合、1
            length = 1;
        } else if (10 <= count) {
            // 10人以上の場合、割る10したもの + 1
            length = count / 10 + 1;
        }

        for (int i =0; i < length; i++) {
            sb.append("*");
        }

        return sb.toString();

    }

}
 0~ 9点: 100人:***********
10~19点: 116人:************
20~29点: 106人:***********
30~39点: 100人:***********
40~49点:  78人:********
50~59点: 108人:***********
60~69点:  84人:*********
70~79点: 108人:***********
80~89点:  86人:*********
90~99点: 107人:***********
   100点:   7人:*

ランダムに点数を得ているため、どの区分もそれなりの人数です。100点は区分が狭いから人数が少ないです。