質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Java

    14049questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1700questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

javaでアンケートの集計結果について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,284

khr0404

score 35

現在javaでアンケートの集計をやっているのですがアンケートの結果が実際の数値と異なって出てきてしまいます。
原因がわからなく手詰まりになっていしまいました。

どこでループがおかしくなっているのか教えて頂きたいです。

実行結果

実行したところこのような結果になります。

Q1. 性別は?  [1 : 男 2 : 女 ]67人
Q2. 年齢は?  [1 : 10代以下  2 : 203 : 304 : 405 : 50代以上  ]36556人
Q3. インターネットの利用頻度は? (携帯電話からの利用も含む)  [1 : ほぼ毎日 2 : たまに 3 : 使ったことがある程度 4 : 使ったことがない ]6356

アンケート実行クラス

public class EnqueteExamMain {


    public static void main( String[] args ) {

        Enquete enq = new Enquete();
        enq.setQuestions( makeQuestion() );

        makeAnswer( enq );

        enq.agg();

        dispResult( enq );
    }


    private static void makeAnswer( Enquete enq ) {

        int[][] ans = {
            {
                1,
                1,
                1
            },
            {
                1,
                2,
                1
            },
            {
                1,
                2,
                1
            },
            {
                1,
                2,
                3
            },
            {
                1,
                3,
                4
            },
            {
                2,
                1,
                1
            },
            {
                2,
                2,
                3
            },
            {
                2,
                4,
                1
            },
            {
                2,
                3,
                2
            },
            {
                2,
                5,
                4
            },
        };

        for ( int i = 0; i < ans.length; i++ ) {
            Answer a = new Answer();
            a.setValues( ans[i] );
            enq.addAnswer( a );
        }
    }


    private static Question[] makeQuestion() {

        String[] s1 = {
            "男",
            "女"
        };
        String[] s2 = {
            "10代以下 ",
            "20代 ",
            "30代 ",
            "40代 ",
            "50代以上 "
        };
        String[] s3 = {
            "ほぼ毎日",
            "たまに",
            "使ったことがある程度",
            "使ったことがない"
        };

        Question[] questions = {
            new Question( "性別は?", s1 ),
            new Question( "年齢は?", s2 ),
            new Question( "インターネットの利用頻度は? (携帯電話からの利用も含む)", s3 )
        };
        return questions;
    }


    private static void dispResult( Enquete enq ) {

        MyResult[] r = enq.getResults();

        for ( int i = 0; i < r.length; i++ ) {
            Question q = r[i].getQuestion();

            System.out.print( "Q" + ( i + 1 ) + ". " + q.getQuestion() );
            System.out.print( "  [" );

            for ( int j = 0, num = q.getLabels().length; j < num; j++ ) {
                System.out.print( ( j + 1 ) + " : " + q.getLabels()[j] + " " );
            }

            System.out.print( "]" );

            for ( int j = 0, num = q.getLabels().length; j < num; j++ ) {
                System.out.print( ( j + 1 ) + r[i].getCount( j ) + "人" );
            }

            System.out.println();
            System.err.println();

        }
    }
}

集計結果を表すクラス

public class MyResult {


    private Question question;

    private final int[] counts;


    public MyResult( Question q ) {

        setQuestion( q );
        this.counts = new int[q.getLabels().length];
    }


    public void countUp( int value ) throws ArrayIndexOutOfBoundsException {

        this.counts[value]++;
    }


    public int getCount( int value ) {

        return this.counts[value];
    }


    public Question getQuestion() {

        return this.question;
    }


    public void setQuestion( Question question ) {

        this.question = question;
    }
}

アンケートの設問一つを現すクラス

public class Question {


    private String question;

    private String[] labels;


    public Question( String question, String[] labels ) {

        setQuestion( question );
        setLabels( labels );
    }


    public String[] getLabels() {

        return this.labels;
    }


    public void setLabels( String[] strings ) {

        this.labels = strings;

    }


    public String getQuestion() {

        return this.question;
    }


    public void setQuestion( String string ) {

        this.question = string;
    }
}

一つ回答を表すクラス

public class Answer {


    private int[] values;


    public int[] getValues() {

        return this.values;
    }


    public void setValues( int[] is ) {

        this.values = new int[is.length];

        for ( int i = 0; i < is.length; i++ ) {
            this.values[i] = is[i] - 1;

        }
    }
}

回答オブジェクトクラス

import java.util.ArrayList;
import java.util.List;


public class Enquete {


    private Question[] questions;

    private final List<Answer> answers = new ArrayList<Answer>();

    private MyResult[] results;


    public Question[] getQuestion() {

        return this.questions;
    }


    public void setQuestions( Question[] questions ) {

        this.questions = questions;
    }


    public void addAnswer( Answer a ) {

        this.answers.add( a );
    }


    public MyResult[] getResults() {

        return this.results;
    }


    public void agg() throws ArrayIndexOutOfBoundsException {


        results = new MyResult[questions.length];

        for ( int i = 0; i < questions.length; i++ ) {
            results[i] = new MyResult( questions[i] );


            for ( int j = 0; j < answers.size(); j++ ) {


                int value[] = answers.get( j ).getValues();

                results[i].countUp( value[i] );
            }


        }
    }
}

補足情報(言語/FW/ツール等のバージョンなど)

java 
eclipse

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

dispResultメソッドの最後のループのこの文

System.out.print( ( j + 1 ) + r[i].getCount( j ) + "人" );


この文は()の中の左から順に処理され、( j + 1 ) + r[i].getCount( j )という足し算が先に処理されてしまいます。つまり、1番の回答は1人、2番の回答は2人多くなってしまいます。
回答人数と「人」という文字を繋げたいのなら、(r[i].getCount( j ) + "人")のように、こっちを括弧で括る必要があります。

私もこれをステップ実行によって見つけたので、自力でのデバッグを試してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/02 13:11

    原因がわかりました。
    swordoneさんに指摘された部分を確認したところ
    '''
    System.out.print( ( j + 1 ) + ":" + r[i].getCount( j ) + "人" );
    '''
    と記述したかったのですが":"を忘れてしまい、カウントに実行回数が足される記述になっていました。
    大変助かりました、有難うございました。

    キャンセル

  • 2016/05/02 13:18

    あとSystem.err.println();はやめたほうがいいかと…
    標準出力とエラー出力が非同期に出力して表示が一定しません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    javaのclassをまとめたい

    質問内容 eclipseを使用してjavaのマルチスレッド(3つ)を作る課題をやっているんですが,現段階ではスレッドごとにクラスを作り処理を行っています。 最終的には一つのクラ

  • 解決済

    Realmを使ってリストビューを表示することができない

    前提・実現したいこと 初めての質問です。Java、android開発歴は2か月程の初級者ですがよろしくお願いします。 囲碁の問題を出題するアプリを作っているのですが、問題リ

  • 解決済

    Unexpected symbol ']',expecting';' or '}'・Unexpec...

    Unexpected symbol ']',expecting';'  と '}'・Unexpected symbol '[',expecting'.' というエラーが St

  • 解決済

    Java Hit&Blow

    Hit&Blowのコードです。 答えの4桁の数字が重複しないためのコードはどのように書けばいいのでしょうか? import java.util.Scanner; class

  • 解決済

    unityで隠しコマンド的なものを導入したいです。

    前提・実現したいこと unityで簡単なゲームをつくっています。 その中で、指定したコマンドを入力したら、シーン切り替えをするという動作をさせたいのですが、コードの書き方がわか

  • 解決済

    2次元配列のコピーと出力

    前提・実現したいこと 要素数が3つで4つの値が入る配列yを作成し、それをコピーした配列xを作成し, 任意の数箇所に別の値を代入しyとxの要素を出力せよ. コンソール↓ 4 

  • 解決済

    java キーボード入力を用いた計算プログラム

    概要 キーボードから入力したテストの結果から、合計・平均・順位(バブルソート)分散・標準偏差を導出するプログラムを作っています。 具体的には 生徒数を入力 ↓ 生徒数の応じた点数を

  • 解決済

    二択問題の作り方について質問です。

    以下の二択問題のプログラムについて質問です。 これは、swingを用いた二択問題です。将来的には四択問題にするつもりです。 プログラミング初心者なため、とても回りくどい書き方ですみ

同じタグがついた質問を見る

  • Java

    14049questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Eclipse

    1700questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。