Menu
Coddy logo textTech

リストからセットへの変換

CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 21/65。

Set の最も実用的な用途の1つは、List から重複する要素を削除することです。セットは自動的に重複を排除するため、重複する値を持つリストをユニークな要素のコレクションに簡単に変換できます。

ListSetに変換するには、単にリストを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 というパターンは、さらなる処理のためにリスト構造を維持しながら、重複を削除してデータをクリーンアップする必要がある場合に非常に一般的です。

challenge icon

チャレンジ

簡単

アンケートの回答から重複するエントリを削除して、データクリーニングシステムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:

  1. アンケートのタイトルを表す文字列入力を読み込む
  2. アンケートの回答を表す複数の文字列入力を読み込む(入力は "responses_done" を受け取った時点で終了します)
  3. すべての元の回答(重複を含む)を格納するための List を作成する
  4. Set.from() を使用してリストを Set に変換し、自動的に重複を削除する
  5. toList() を使用して Set を一意の回答の List に戻す
  6. データクリーニングの結果を、以下に示す正確な形式で出力する

例えば、アンケートのタイトルが "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}

SetListに戻すには、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");
  // ここに残りの出力ステートメントを追加してください
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン