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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

4回答

12795閲覧

ランダムにテキストを表示させる

退会済みユーザー

退会済みユーザー

総合スコア0

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/04/28 09:04

4択のクイズアプリを作っているのですが、回答の4択をランダムに表示させる方法で困っています。
4つのString型の文字列を4つのテキストビューにランダムな順番に表示させたいのですが簡潔な書き方ができなく困っています。
4つを並び替えるのは24通りありすべての通りを別々に書いているのですが(下記のコード)それだと正誤判定の場面でも場合分けしなければいけなく大変で、簡潔に書ける方法があれば教えていただきたいです。

Random random = new Random(); int i = random.nextInt(24); if (i == 0){ a1.setText(answer1); a2.setText(answer2); a3.setText(answer3); a4.setText(answer4); }else if (i == 1){ a1.setText(answer1); a2.setText(answer2); a3.setText(answer4); a4.setText(answer3); }..............

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

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

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

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

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

swordone

2017/04/28 13:16

どのようにして正誤判定するのですか?正解の文字列そのものを登録しているのか、番号で管理しているのか?
退会済みユーザー

退会済みユーザー

2017/04/29 05:05

正解の文字列1つと選択肢の文字列を4つ用意して選択肢の中に一つだけ正解の文字列と同じものを用意して、.equals()で比較するような処理をしています。
guest

回答4

0

ベストアンサー

java

1String[] answers = {answer1, answer2, answer3, answer4}; 2// 何らかの方法で正解が定められているなら、それで正解の"文字列"を保持しておく 3String corAnswer = answer1; 4 5Random r = new Random(); 6//配列シャッフル。アルゴリズムの詳細は「シャッフル アルゴリズム」などで検索すれば出る 7for (int i = answers.length - 1; i > 0; i--) { 8 int x = r.nextInt(i + 1); 9 if (x != i) { 10 String temp = answers[x]; 11 answers[x] = answers[i]; 12 answers[i] = temp; 13 } 14} 15 16a1.setText(answers[1]); 17a2.setText(answers[2]); 18a3.setText(answers[3]); 19a4.setText(answers[4]); 20

後はクリックイベントでクリックされたTextViewからgetTextして、corAnswerと比較して正誤判定すればいい。

投稿2017/04/28 16:03

swordone

総合スコア20649

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

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

KSwordOfHaste

2017/04/28 21:25

本件の実装においては、自分はswordoneさんの回答コードを好みます。 この論理を見て間違ってないことを検証するのに苦労(苦痛)がないからですw;
退会済みユーザー

退会済みユーザー

2017/04/29 05:10

ありがとうございます。このコードなら分かりやすいです!
KSwordOfHaste

2017/04/29 05:31

一応申し上げておきますと、自分が言おうとした方法を素直に書いてくださったのがswordoneさんの回答です。自分の回答だとわかりにくかったのですね。失礼しました!
guest

0

4枠をランダムに並べるのは、次のように考えればそう複雑ではない気がします。

最初の候補:4つの枠から1つ選びそこへ表示することにする
次の候補:残った3つの枠から1つ選びそこへ
・・・
最後の枠:残った1つの枠へ

また、正解の判定ですが、そこは工夫次第と思います。例えば正解は「最後の枠に表示する」と最初から決めておけばいいのです。正解でない3つの候補を枠へ割り当てていき、最後に残った枠が正解枠と覚えておけば単純にできるのではないでしょうか?


追記:
自分の回答や質問者さんの回答コメントをみていて、自分が舌足らずな話をしていることに気づきました。目的によってコードの良し悪しの基準は違ってきますね。

  • バグを減らす

このためには論理を単純にします。論理を単純にすることには制御論理を単純にしたり、似たようなコードを繰り返さないことなど、「正しい論理であることの検証が容易」であることを優先します。

  • 実行性能を最適化する

制御論理を単純にして、実行ステップが最小になることを優先します。場合によっては似たようなコードを繰り返すこともあえてやることがあります。

自分の回答は前者「バグを減らす」を基準に「制御論理の単純化を含む、いくつかの観点」を総合して考えています。一方質問者さんの意識には「制御論理が単純である」が第一にあるような気がします。それは性能優先という意味では単純と言えます。ただバグを減らすという視点から見ると単純とはいえません。

性能優先:ご質問のコード > 自分の回答
バグ排除優先:ご質問のコード < 自分の回答

といってよいと思います。

なお、自分の感覚では「4つの選択肢をランダムに並べるゲーム」という規模の実装では性能をそこまで優先する必要はないと思います。またバグを減らすという点については制御論理の単純化とそれ以外の観点のバランスをどう優先するかはプログラマーの感覚(好み)次第のところもあると思います。

投稿2017/04/28 09:11

編集2017/04/28 21:17
KSwordOfHaste

総合スコア18392

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

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

退会済みユーザー

退会済みユーザー

2017/04/28 09:21

それは今自分の使っている乱数で実現することができますか? それでも結局は24通りになってしまうようなきがするのですが、、、
KSwordOfHaste

2017/04/28 09:25 編集

素朴に作るなら3回乱数を使うことになるでしょう。ただ、24個のif elseをかかなくても済みますよ。
退会済みユーザー

退会済みユーザー

2017/04/28 09:54

24回のif elseを書くか3回乱数を使う以上に簡潔な方法はないということですか?
KSwordOfHaste

2017/04/28 10:00

3回乱数を使う以上に簡潔な方法は自分にはおもいつきません。自分がいう「簡潔さ」とは「同じことを繰り返しかかない」「行数が多くならない」「複雑でない」といったことをイメージしています。そういう意味では24回のif elseは簡潔でないと感じます。ところで3回の乱数を使うというのは3回同じ処理を並べるということを必ずしも意味しません。自分なら少なくとも繰り返し処理で書きますので乱数を取るコードは1か所しか出現しません。
swordone

2017/04/28 13:29

質問者様は、何を以て「簡潔」と言いたいのでしょう?
退会済みユーザー

退会済みユーザー

2017/04/29 05:09

24通りも書かなければいけないのは簡潔ではないのかなと思い質問させていただきました。 3回乱数を使う場合でも、結局は24通り書かなければいけないのではと思い簡潔ではないのかなと感じました。
guest

0

思いつきですが…

配置パターン(順列; 24x4)をあらかじめ生成しておいて、
それに対してランダムにチョイス&セットみたいな感じはどうでしょ?
パターンの生成がメンドウな感じですが、
数がそれほどでもないなら、べた書きでもいいのかなあ、と。
準備が簡潔ではありませんが、使う方は簡潔になると思います。
--- 追加 ---
コードを書いてみました。
間違ってたら申し訳ない。

Java

1int[][] pat = { 2 {0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}, 3 {1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0}, 4 {2,0,1,3},{2,0,3,1},{2,1,0,3},{2,1,3,0},{2,3,0,1},{2,3,1,0}, 5 {3,0,1,2},{3,0,2,1},{3,1,0,2},{3,1,2,0},{3,2,0,1},{3,2,1,0}}; 6 7Random random = new Random(); 8int i = random.nextInt(24); 9 10// answerは回答の配列 11a1.setText(answer[pat[i][0]]); 12a2.setText(answer[pat[i][1]]); 13a3.setText(answer[pat[i][2]]); 14a4.setText(answer[pat[i][3]]);

投稿2017/04/28 13:25

編集2017/04/28 13:45
takasima20

総合スコア7458

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問