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

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

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

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

2回答

1302閲覧

重複なしで文字列を順番に取り出す

Kimura_unity

総合スコア5

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/07/28 17:33

dart

1import 'dart:math'as math; 2 3random(BuildContext context) { 4 var list = ['a', 'b', 'c', 'd']; 5 6 list.shuffle(); 7 8 print('$list'); 9 10 } 11``` クイズアプリを制作において、登録してある文章(文字列)を重複せずに順番に取り出したいです。 12あらかじめ登録してある文章(a,b,c,d…)をボタンを押すたびにランダムで取り出してテキストに表示させたいです。 13 14一斉にランダムで取り出す方法、重複を許して取り出す方法などはわかるのですが、ボタンを押すたびにテキストに重複せずにランダムで表示させる方法がわかりません… 登録してある文章がすべて表示されたら「終了」と表示させることができるとさらにありがたいです… 15 教えていただけたら幸いです!

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでどうでしょうか?
コピーしてDartPadで実行してみてください。

Dart

1import 'package:flutter/material.dart'; 2 3final Color darkBlue = Color.fromARGB(255, 18, 32, 47); 4 5void main() { 6 runApp(MyApp()); 7} 8 9class MyApp extends StatelessWidget { 10 11 Widget build(BuildContext context) { 12 return MaterialApp( 13 theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue), 14 debugShowCheckedModeBanner: false, 15 home: Scaffold( 16 body: Center( 17 child: MyWidget(), 18 ), 19 ), 20 ); 21 } 22} 23 24class MyWidget extends StatefulWidget { 25 26 _MyWidgetState createState() => _MyWidgetState(); 27} 28 29class _MyWidgetState extends State<MyWidget> { 30 bool _isEnd = false; 31 String _text = ""; 32 List<String> _quizzes = ["クイズ1", "クイズ2", "クイズ3", "クイズ4"]; 33 34 35 void initState() { 36 super.initState(); 37 _random(); 38 } 39 40 41 Widget build(BuildContext context) { 42 return Column( 43 mainAxisAlignment: MainAxisAlignment.center, 44 children: [ 45 _isEnd ? Text("終了") : Text(_text), 46 if (!_isEnd) RaisedButton( 47 child: Text("次へ"), 48 onPressed: _random, 49 ), 50 ], 51 ); 52 } 53 54 void _random() { 55 setState(() { 56 if (_quizzes.length > 0) { 57 _quizzes.shuffle(); 58 _text = _quizzes[0]; 59 _quizzes.removeAt(0); 60 } else { 61 _isEnd = true; 62 } 63 }); 64 } 65 66} 67

投稿2020/07/29 02:25

編集2020/07/29 02:33
tepci

総合スコア419

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

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

Kimura_unity

2020/07/29 02:30

まさに求めていたものでした!丁寧にコード全体までありがとうございます!ほんとに助かりました????
tepci

2020/07/29 02:33

いえいえ、よかったです! コード少し修正しました!
Kimura_unity

2020/07/30 06:39

ありがとうございます!もうまさに頑張って作っていたそのものです(笑) 丁寧で適切な回答ほんとにありがとうございました!
guest

0

僕はDart/Flutterは使った事がないのですが、文法は他の言語とそれほど大きく違わないようなので、とりあえず僕の想像できる範囲内で書いてみますね。(Dart/Flutterの文法とかプログラムの組み方で間違っている部分があるかもしれないので、鵜呑みにはせずにあくまで参考程度に!)

「重複を許容せずにランダムに取り出す」とは、次のような理解でよろしいでしょうか?

・A, B, C, Dの4つのテキストがあるとしたら、ランダムに取り出す回数は全部で4回。

・例えば、1回目にランダムに選ばれたのがBだとしたら、2回目はA, C, Dの3つの中からランダムに1つ選ぶ。2回目に選ばれたのがDだとしたら、3回目はA, Cのどちらかからランダムに1つ選ぶ、みたいな感じ。

だとしたら、既に選ばれたテキストは最初のリストから除外し、残ったリスト内のアイテムからランダムに選ぶ、というのをリスト内のアイテムがなくなるまで繰り返せばいいと思います。

例えば、

import 'dart:math'as math; random(BuildContext context) { var list = ['a', 'b', 'c', 'd']; var listOriginalLength = list.length; //元のリスト内のアイテムの数を記録しておく // リスト内にアイテムが残っている限り、その中からランダムに選び続ける for(int i = 0; i < listOriginalLength; i++){ print('ボタンを押してください'); // ここにユーザーにボタンを押させる動作を入れる。 // 僕の今の頭の中の情報ではどうやるかはわかりません if(list.length > 1){ list.shuffle(); } print(´$list[0]´); // シャッフルした後でリスト内の最初のテキストを表示 if(listOriginalLength > 0){ list.removeAt(0); // 選ばれたアイテムをリストから取り除く(次回以降の重複を防ぐため) } } print('終了'); }

みたいな感じになるでしょうか。

※注※
僕自身もまだエンジニアではなく勉強中の身なので、もっと知見がある方で僕のコードに間違いを見つけましたら指摘していただけると助かります。

投稿2020/07/28 19:12

編集2020/07/28 19:17
Sean2014

総合スコア59

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

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

Kimura_unity

2020/07/28 21:10

回答本当にありがとうございます! 自分なりにいろいろやっては見たのですが、下記2点により実現したいものを再現することができませんでした… ・ボタンを押すたびに新しい値が欲しいのですが、ボタンを押すとすべての値が出てしまう ・自分なりにいろいろ変更してみたのですが、ボタンを押すたびにrandom(){}を毎回実行されるため削除した要素が戻ってきてしまう 私のスキルのなさによりうまく生かすことができませんでした…ほんとにごめんなさい!????
Sean2014

2020/07/29 03:34

いえいえ、他の方からしっくりくる答えがもらえて最終的には解決できたようでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問