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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

3066閲覧

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

q0220_3694

総合スコア11

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/07/05 03:46

編集2016/07/05 23:39

###前提・実現したいこと
大変恐縮ですが、下記についてご教示頂きたく思います。

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

何卒宜しくお願い致します。
###発生している問題・エラーメッセージ

出題についてはランダムで表示する事は出来たのですが、
回答の選択肢をランダムでラジオボタンに表示する方法がわからないといった現状です。

また、回答の選択肢のラジオボタンを選択した段階で、次のクイズに進むやり方がわかりません。
###該当のソースコード

java

1 2 3import android.os.Bundle; 4import android.support.v7.app.AppCompatActivity; 5import android.view.View; 6import android.widget.RadioButton; 7 8import java.util.Arrays; 9import java.util.Collections; 10import java.util.List; 11 12public class MainActivity extends AppCompatActivity { 13 14 //問題内容の定義 15 String[] QUESTION = {"日本", "本", "机"}; 16 17 String[][] ANSWRE = { 18 {"Japan", "Japon", "Jpan"}, 19 {"book", "buuk", "buok"}, 20 {"desk", "desc", "desuk"}, 21 }; 22 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.activity_main); 27 28 //ラジオボタン 29 RadioButton[][] radio = new RadioButton[ANSWRE.length][ANSWRE[0].length]; 30 //ラジオボタン設定 31 for(int n = 0; n < ANSWRE.length; n++) { 32 for (int m = 0; m < ANSWRE[n].length; m++) { 33 radio[n][m] = new RadioButton(this); 34 radio[n][m].setText(ANSWRE[n][m]); 35 //idの設定とかもここで 36 radio[n][m].setId(m); 37 38 39 View.OnClickListener event = null; 40 radio[n][m].setOnClickListener(event); 41 event = new View.OnClickListener() { 42 @Override 43 public void onClick(View v) { 44 if (v.getId() == 0) { 45 //正解処理 46 } else { 47 //不正解処理 48 } 49 //次の問題へ 50 } 51 }; 52 } 53 } 54 55 //Toiクラス利用 56 Toi[] toi = new Toi[QUESTION.length]; 57 for(int n = 0; n < toi.length; n++) 58 toi[n] = new Toi(QUESTION[n], radio[n]); 59 60 List<Toi> list1 = Arrays.asList(toi.clone()); 61 Collections.shuffle(list1);//toiをシャッフルしたList型 list1 62 for(Toi t: list1){ 63 List<RadioButton> list2 = Arrays.asList(t.radio.clone()); 64 Collections.shuffle(list2);//シャッフル 65 t.radio = list2.toArray(new RadioButton[]{});//元に戻す 66 } 67 } 68 69 70------------------------------------------------ 71 72import android.widget.RadioButton; 73 74public class Toi { 75 76 String que; 77 RadioButton[] radio; 78 Toi(String que, RadioButton[] radio){ 79 this.que = que; 80 this.radio = radio; 81 } 82} 83 84

###試したこと
下記サイトを参考にしたのですが、理解が追いつかずうまく出来ませんでした。
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>

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

次の単位でシャッフルするはずです。
0. 問題をシャッフル
[日本 Japan Japon Jpan]
[本 buuk book buok]
[机 desuk desc desk]
0. ラジオボタンをシャッフル
日本 [Japan] [Japon] [Jpan]

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

java

1class Toi{ 2 String que; 3 RadioButton[] radio; 4 Toi(String que, RadioButton[] radio){ 5 this.que = que; 6 this.radio = radio; 7 } 8}

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

java

1String[] QUESTION = {"日本", "本", "机"}; 2 3String[][] ANSWRE ={ 4 {"Japan","Japon","Jpan"}, 5 {"buuk","book","buok"}, 6 {"desuk","desc","desk"}, 7}; 8//-------------- 9//ラジオボタン 10RadioButton[][] radio = new RadioButton[ANSWRE.length][ANSWRE[0].length]; 11//ラジオボタン設定 12for(int n = 0; n < ANSWRE.length; n++){ 13 for(int m = 0; m < ANSWRE[n].length; m++){ 14 radio[n][m] = new RadioButton(this); 15 radio[n][m].setText(ANSWRE[n][m]); 16 //idの設定とかもここで 17 } 18} 19 20//Toiクラス利用 21Toi[] toi = new Toi[QUESTION.length]; 22for(int n = 0; n < toi.length; n++) 23 toi[n] = new Toi(QUESTION[n], radio[n]);

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

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

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

java

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

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

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

投稿2016/07/05 05:53

編集2016/07/05 12:31
intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

q0220_3694

2016/07/05 06:21

intelfike様 ご回答有難う御座います。 ご丁寧にコードまで書いて頂き大変勉強になります。 ご教示頂きました内容で行ってみます。 この度は本当に有難う御座います。
intelf___

2016/07/05 09:47

あ、listから取り出さないとだめですね。 list1.get(0).que = 問題の文字 list1.get(0).ans = ラジオボタンの配列 です
q0220_3694

2016/07/05 10:52

intelfike様 追加コメント有難う御座います。 一度これでやってみます。勉強になります。
intelf___

2016/07/05 12:26

実行環境の構築ができたので修正していきますね
q0220_3694

2016/07/05 15:15

intelfike様 お忙しいところ修正までして頂き本当に有難う御座います。 javaを始めたばかりで勉強不足であり、お願いばかりで恐縮なのですが、 上記まではコードをかけてのですが、うまく進みません。 もしよろしければ、下記についてお教え頂けないでしょうか。 各ラジオボタンに回答を入れる方法。 選択後、次の問題に行く方法。 大変恐縮なのですが、何卒宜しくお願い致します。
intelf___

2016/07/05 15:37

配列の最初を正解にするとやりやすいです。 String[][] ANSWRE ={ {"Japan","Japon","Jpan"}, {"book","buuk","buok"}, {"desk","desuk","desc"}, }; //id設定とかもここで のところで radio[n][m].setId(m); とかしてidを設定して、 radio[n][m].setOnClickListener(event); でクリックイベントを設定。 リスナーの引数でidを取り出しましょう。 event変数はこんな感じ? View.OnClickListener event = new View.OnClickListener(){ @Override public void onClick(View v){ if(v.getId() == 0){ //正解処理 }else{ //不正解処理 } //次の問題へ } };
intelf___

2016/07/05 17:02

ラジオボタンのグループ化、画面の遷移などは自力で調べられそうですか?
q0220_3694

2016/07/05 23:50

intelfike様 コメントを頂きまして有難う御座います。 配列の先頭に正解を入れました。 ラジオボタンのグループ化ですが、上記のxmlの様では間違っているでしょうか? 一応、RadioGroup(id/radiogroup)の中に、RadioButton(id/radio1,radio2,radio3)を入れています。 申し訳ありません。 下記の項目で行き詰っています。 ・問題を(日本、本、机)をText(id/textView2)に入れる方法 ・回答選択肢を入れるための、ラジオボタンのid設定 ・第三問目の選択をしたら、画面の遷移する方法 質問してばかりで、ご迷惑をおかけして大変申し訳ありません。 可能な範囲で教えて頂けないでしょうか。 何卒宜しくお願い致します。
intelf___

2016/07/06 00: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問目... という遷移はどうでしょう。
q0220_3694

2016/07/06 12:07

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

0

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

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

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

投稿2016/07/05 03:50

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

q0220_3694

2016/07/05 06:19

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

2016/07/05 07:35

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

2016/07/05 10:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問