リストのシャッフル
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 8/65。
リスト内の要素の順序をランダムに並べ替える必要がある場合、Dartはshuffle()メソッドを提供しています。このメソッドはリスト内のすべての要素をランダムに再配置し、ゲームやシミュレーション、あるいはランダムな配置が必要なあらゆる状況に最適な、予測不可能な順序を作成します。
shuffle() メソッドは元のリストを直接変更し、すべての要素の位置をランダムに入れ替えます。shuffle() を呼び出すたびに、同じ要素の異なる配置が得られます。
List<String> cards = ['Ace', 'King', 'Queen', 'Jack'];
print('Original: $cards'); // [Ace, King, Queen, Jack]
cards.shuffle();
print('Shuffled: $cards'); // [Queen, Ace, Jack, King] (ランダムな順序)このメソッドは、カードゲームの作成、クイズの質問のランダム化、またはアイテムを予測不可能な順序で提示したいあらゆるアプリケーションで特に役立ちます。shuffle() はインプレース(元のリストを直接変更)で動作するため、新しいリストを作成する必要はありません。既存のリストが自動的にランダムに再構成されます。
チャレンジ
簡単ゲームトーナメントのブラケットを管理するために、チームをシャッフルしてランダムな対戦カードを作成するプログラムを作成してください。プログラムは以下の動作を行う必要があります:
- トーナメント名を表す文字列入力を読み取ります(この値は読み取りますが出力はしません)
- チーム名を表す複数の文字列入力を読み取ります(空の文字列が入力された時点で終了します)
- チームをランダムな順序にシャッフルします
- 各チーム名を個別の行に出力します
例えば、トーナメント名が "Local Cup" で、チームが "Wolves"、"Hawks" の場合、プログラムはシャッフルされた(ランダムな)順序でチーム名を1行に1つずつ出力する必要があります:
Hawks
Wolvesまたは:
Wolves
Hawksshuffle() は順序をランダム化するため、チームのどのような並び順も有効です。
チートシート
shuffle()メソッドは、リスト内の要素の順序をランダムにします。
List<String> cards = ['Ace', 'King', 'Queen', 'Jack'];
print('Original: $cards'); // [Ace, King, Queen, Jack]
cards.shuffle();
print('Shuffled: $cards'); // [Queen, Ace, Jack, King] (ランダムな順序)shuffle()メソッドは、元のリストを直接変更し、呼び出されるたびに異なるランダムな配置を作成します。
自分で試してみよう
import 'dart:io';
void main() {
// トーナメント名を読み込む
String? tournamentName = stdin.readLineSync();
// 空の文字列が入力されるまでチーム名を読み込む
List<String> teams = [];
String? teamName;
while ((teamName = stdin.readLineSync()) != null && teamName!.isNotEmpty) {
teams.add(teamName);
}
// TODO: ランダムな対戦のためにチームリストをシャッフルする
// 各チームを個別の行に出力する
for (String team in teams) {
print(team);
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー