リストからセットへの変換
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 21/65。
Set の最も実用的な用途の1つは、List から重複する要素を削除することです。セットは自動的に重複を排除するため、重複する値を持つリストをユニークな要素のコレクションに簡単に変換できます。
ListをSetに変換するには、単にリストをSet.from()コンストラクタに渡すだけです。これにより、元のリストのすべてのユニークな要素を含む新しいセットが作成されます。
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}結果を List として戻す必要がある場合(おそらくコードの他の部分との互換性を維持するため)、toList() を使用してセットをリストに戻すことができます。これにより、元のリストから一意の要素のみを含むリストが得られます。
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]この List → Set → List というパターンは、さらなる処理のためにリスト構造を維持しながら、重複を削除してデータをクリーンアップする必要がある場合に非常に一般的です。
チャレンジ
簡単アンケートの回答から重複するエントリを削除して、データクリーニングシステムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:
- アンケートのタイトルを表す文字列入力を読み込む
- アンケートの回答を表す複数の文字列入力を読み込む(入力は
"responses_done"を受け取った時点で終了します) - すべての元の回答(重複を含む)を格納するための List を作成する
Set.from()を使用してリストを Set に変換し、自動的に重複を削除するtoList()を使用して Set を一意の回答の List に戻す- データクリーニングの結果を、以下に示す正確な形式で出力する
例えば、アンケートのタイトルが "Customer Satisfaction Survey" で、回答が "Excellent", "Good", "Excellent", "Fair", "Good", "Excellent", "Poor" の場合、プログラムは以下のように出力する必要があります:
Survey: Customer Satisfaction Survey
Original responses: [Excellent, Good, Excellent, Fair, Good, Excellent, Poor]
Total responses collected: 7
Converting to Set to remove duplicates...
Unique responses (Set): {Excellent, Good, Fair, Poor}
Converting back to List...
Cleaned responses: [Excellent, Good, Fair, Poor]
Duplicates removed: 3
Final unique responses: 4
Status: Data cleaning completed successfullyアンケートのタイトルが "Product Feedback" で、回答が "Like", "Dislike", "Like", "Like" の場合、プログラムは以下のように出力する必要があります:
Survey: Product Feedback
Original responses: [Like, Dislike, Like, Like]
Total responses collected: 4
Converting to Set to remove duplicates...
Unique responses (Set): {Like, Dislike}
Converting back to List...
Cleaned responses: [Like, Dislike]
Duplicates removed: 2
Final unique responses: 2
Status: Data cleaning completed successfullyアンケートのタイトルが "Event Rating" で、回答が "Amazing", "Okay", "Great" の場合、プログラムは以下のように出力する必要があります:
Survey: Event Rating
Original responses: [Amazing, Okay, Great]
Total responses collected: 3
Converting to Set to remove duplicates...
Unique responses (Set): {Amazing, Okay, Great}
Converting back to List...
Cleaned responses: [Amazing, Okay, Great]
Duplicates removed: 0
Final unique responses: 3
Status: Data cleaning completed successfullyプログラムは、List → Set → List という完全なパターンを示す必要があります。まずすべての回答を List に保存し、次に Set.from() を使用して List から Set を作成し、最後に toList() を使用して Set を List に戻します。削除された重複の数は、元の総数から最終的な一意の数を引くことで計算してください。
チートシート
Listから重複を削除するには、Set.from()を使用してSetに変換します:
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}SetをListに戻すには、toList()を使用します:
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]List → Set → Listのパターンは、リストの構造を維持しながらデータクリーニングを行う際によく使用されます。
自分で試してみよう
import 'dart:io';
void main() {
// アンケートのタイトルを読み込む
String? surveyTitle = stdin.readLineSync();
// "responses_done" が入力されるまでアンケートの回答を読み込む
List<String> originalResponses = [];
String? response;
while ((response = stdin.readLineSync()) != "responses_done") {
if (response != null) {
originalResponses.add(response);
}
}
// TODO: 以下にコードを記述してください
// 1. Set.from() を使用してリストを Set に変換する(重複を削除)
// 2. toList() を使用して Set を再びリストに変換する
// 3. 削除された重複の数と最終的なカウントを計算する
// 結果を所定の形式で出力する
print("Survey: $surveyTitle");
print("Original responses: $originalResponses");
// ここに残りの出力ステートメントを追加してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー