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

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

ただいまの
回答率

89.98%

ja【Android java】クイズアプリ 多次元配列のシャッフルについて

解決済

回答 2

投稿 編集

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

q0220_3694

score 9

前提・実現したいこと

大変恐縮ですが、下記についてご教示頂きたく思います。

【目的】 
出題の順番がランダムで出てくるクイズに対して、ラジオボタンを用いて三択形式で回答の選択肢を表示する。 
この時、出題に対する回答の選択肢も毎回順番をランダムにしたい。 
選択肢のラジオボタンの1つを選択すると次の問題に進むとする。 
この動きを3回繰り返す。

何卒宜しくお願い致します。

発生している問題・エラーメッセージ

① 
出題についてはランダムで表示する事は出来たのですが、 
回答の選択肢をランダムでラジオボタンに表示する方法がわからないといった現状です。 
② 
また、回答の選択肢のラジオボタンを選択した段階で、次のクイズに進むやり方がわかりません。

該当のソースコード

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.RadioButton;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    //問題内容の定義
    String[] QUESTION = {"日本", "本", "机"};

    String[][] ANSWRE = {
            {"Japan", "Japon", "Jpan"},
            {"book", "buuk", "buok"},
            {"desk", "desc", "desuk"},
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //ラジオボタン
        RadioButton[][] radio = new RadioButton[ANSWRE.length][ANSWRE[0].length];
        //ラジオボタン設定
        for(int n = 0; n < ANSWRE.length; n++) {
            for (int m = 0; m < ANSWRE[n].length; m++) {
                radio[n][m] = new RadioButton(this);
                radio[n][m].setText(ANSWRE[n][m]);
                //idの設定とかもここで
                radio[n][m].setId(m);


                View.OnClickListener event = null;
                radio[n][m].setOnClickListener(event);
                event = new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (v.getId() == 0) {
                            //正解処理
                        } else {
                            //不正解処理
                        }
                        //次の問題へ
                    }
                };
            }
        }

        //Toiクラス利用
        Toi[] toi = new Toi[QUESTION.length];
        for(int n = 0; n < toi.length; n++)
            toi[n] = new Toi(QUESTION[n], radio[n]);

        List<Toi> list1 = Arrays.asList(toi.clone());
        Collections.shuffle(list1);//toiをシャッフルしたList型 list1
        for(Toi t: list1){
            List<RadioButton> list2 = Arrays.asList(t.radio.clone());
            Collections.shuffle(list2);//シャッフル
            t.radio = list2.toArray(new RadioButton[]{});//元に戻す
        }
    }


------------------------------------------------

import android.widget.RadioButton;

public class Toi {

    String que;
    RadioButton[] radio;
    Toi(String que, RadioButton[] radio){
        this.que = que;
        this.radio = radio;
    }
}

試したこと

下記サイトを参考にしたのですが、理解が追いつかずうまく出来ませんでした。 
http://jan.tokyo/java/2015/11/07/%EF%BC%92%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB%E3%81%99%E3%82%8B/

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

下記がXMLとなります。

【XML】 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin">

<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textAppearance="?android:attr/textAppearanceLarge" 
android:text="下記の日本語を英語でいうと?" 
android:id="@+id/textView" 
android:layout_marginTop="68dp" 
android:layout_alignParentTop="true" 
android:layout_alignParentLeft="true" 
android:layout_alignParentStart="true" />

<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textAppearance="?android:attr/textAppearanceLarge" 
android:id="@+id/textView2" 
android:layout_below="@+id/textView" 
android:layout_centerHorizontal="true" 
android:layout_marginTop="53dp" />

<RadioGroup android:id="@+id/radiogroup" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_below="@+id/textView2" 
android:layout_alignParentLeft="true" 
android:layout_alignParentStart="true" 
android:layout_marginTop="86dp"> 
<RadioButton android:id="@+id/radio1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:checked="false" 
/> 
<RadioButton android:id="@+id/radio2" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:checked="false" 
/> 
<RadioButton android:id="@+id/radio3" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:checked="false" 
/> 
</RadioGroup>

</RelativeLayout>

大変恐縮ですが、参考になるコードをお教えいただけないでしょうか。
何卒宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

文字だけシャッフルしても判定ができないです。
RadioButtonを多次元配列にしてシャッフルしましょう。

次の単位でシャッフルするはずです。

  1. 問題をシャッフル
    [日本 Japan Japon Jpan]
    [本 buuk book buok]
    [机 desuk desc desk]
  2. ラジオボタンをシャッフル
    日本 [Japan] [Japon] [Jpan]

まとめて扱ったり分けて扱ったりしているので予め構造体のようなクラスを宣言するとよさそうですね。

class Toi{
    String que;
    RadioButton[] radio;
    Toi(String que, RadioButton[] radio){
        this.que = que;
        this.radio = radio;
    }
}


こんな感じのクラス。
利用↓

String[] QUESTION = {"日本", "本", "机"};

String[][] ANSWRE ={
     {"Japan","Japon","Jpan"},
     {"buuk","book","buok"},
     {"desuk","desc","desk"},
};
//--------------
//ラジオボタン
RadioButton[][] radio = new RadioButton[ANSWRE.length][ANSWRE[0].length];
//ラジオボタン設定
for(int n = 0; n < ANSWRE.length; n++){
    for(int m = 0; m < ANSWRE[n].length; m++){
        radio[n][m] = new RadioButton(this);
        radio[n][m].setText(ANSWRE[n][m]);
        //idの設定とかもここで
    }
}

//Toiクラス利用
Toi[] toi = new Toi[QUESTION.length];
for(int n = 0; n < toi.length; n++)
    toi[n] = new Toi(QUESTION[n], radio[n]);

ここからシャッフルをします。

 List<String> list1 = Arrays.asList(QUESTION.clone());
 Collections.shuffle(list1);

これを利用すると、toiとtoi[0~2].ansをシャッフルするので

List<Toi> list1 = Arrays.asList(toi.clone());
Collections.shuffle(list1);//toiをシャッフルしたList型 list1
for(Toi t: list1){
    List<RadioButton> list2 = Arrays.asList(t.radio.clone());
    Collections.shuffle(list2);//シャッフル
    t.radio = list2.toArray(new RadioButton[]{});//元に戻す
}


のようになるかと。
list1.get(0).que = 問題の文字
list1.get(0).radio = ラジオボタンの配列
で取り出せます。

こちらに実行環境がないのでミスがあると思います。参考までに。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/06 08:50

    intelfike様
    コメントを頂きまして有難う御座います。
    配列の先頭に正解を入れました。
    ラジオボタンのグループ化ですが、上記のxmlの様では間違っているでしょうか?
    一応、RadioGroup(id/radiogroup)の中に、RadioButton(id/radio1,radio2,radio3)を入れています。

    申し訳ありません。
    下記の項目で行き詰っています。
    ・問題を(日本、本、机)をText(id/textView2)に入れる方法
    ・回答選択肢を入れるための、ラジオボタンのid設定
    ・第三問目の選択をしたら、画面の遷移する方法

    質問してばかりで、ご迷惑をおかけして大変申し訳ありません。
    可能な範囲で教えて頂けないでしょうか。
    何卒宜しくお願い致します。

    キャンセル

  • 2016/07/06 09:28

    全部javaで書いているのでXMLはちょっとわかりませんが
    TextView text1 = (TextView)findViewById(R.id.my_text1);
    text1.setText("日本");
    のようにidからオブジェクトを取得できるらしいです。

    ラジオボタンid=0を正解に設定して判定するのはどうでしょう。
    String[][] ANSWRE ={
    {"Japan","Japon","Jpan"},
    {"book","buuk","buok"},
    {"desk","desuk","desc"},
    };
    これをラジオボタンのテキストにしますが、この時に一番左に正解を入れておきます。
    idを内ループのカウントに合わせることでjapan=0,japon=1,jpan=3となります。
    シャッフル後でもid=0のものが正解になっています。

    1問目→2問目→3問目→クリア画面→1問目...
    という遷移はどうでしょう。

    キャンセル

  • 2016/07/06 21:07

    intelfike様
    コメントを頂いたに関わらずご返信が遅くなりまして申し訳御座いません。
    色々とお調べ頂いたようで有難う御座います。大変助かります。
    遷移に関しても、ご教示頂いて内容で行ってみます。
    何から何までお教え頂きまして、本当に有難う御座います。

    キャンセル

0

リンクのコードが参考になります。このコードを理解した方が良いです。

どこがわからないのでしょうか?

また、リンクはリンク用の記述に、コードはコード用の記述に修正してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/05 15:19

    yona様
    ご回答有難う御座います。
    まずは、リンク先のコードを理解する事から始めます。

    キャンセル

  • 2016/07/05 16:35

    あと、クリックすると次のボタンに行くのであればラジオボタンではなく、普通のボタンを使うべきだと思います。

    キャンセル

  • 2016/07/05 19:48

    yona様
    アドバイス有難う御座います。
    ラジオボタンで出来ましたら、ボタンでやってみます。

    キャンセル

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

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