Menu
Coddy logo textTech

差集合

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

ある Set には存在するが、別の Set には存在しない要素を見つけたい場合があります。difference() メソッドは、最初のセットに含まれていて、2番目のセットには存在しない要素のみを含む新しいセットを作成することで、これを解決します。

集合の引き算と考えてください。1つ目の集合から2つ目の集合のすべての要素を取り除きます。difference() メソッドは、残りの要素を含む新しい集合を返し、元の集合は両方とも変更されません。

Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};

Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks);  // {meeting, report}

この操作は、何が不足しているか、何が残っているか、あるいはあるコレクションが別のコレクションと比較して何がユニークであるかを見つけるのに特に役立ちます。共通点を見つける積集合(intersection)とは異なり、差集合(difference)はある集合を別の集合から区別する要素を強調します。

challenge icon

チャレンジ

簡単

計画されているがまだ完了していないタスクを特定することで、プロジェクト管理システムを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:

  1. プロジェクト名を表す文字列入力を読み込む
  2. 計画されたタスクを表す複数の文字列入力を読み込む(入力は "planned_done" を受け取ったときに終了します)
  3. 完了したタスクを表す複数の文字列入力を読み込む(入力は "completed_done" を受け取ったときに終了します)
  4. 計画されたタスクと完了したタスクを保存するために、2つの別々の Set を作成する
  5. difference() メソッドを使用して、計画されているがまだ完了していないタスクを見つける
  6. 以下に示す正確な形式でプロジェクトのステータス分析を出力する

例えば、プロジェクト名が "Website Launch" で、計画されたタスクが "Design mockups""Write content""Setup database""Test functionality""Deploy site" であり、完了したタスクが "Design mockups""Setup database" の場合、プログラムは以下のように出力する必要があります:

Project: Website Launch
Planned tasks: {Design mockups, Write content, Setup database, Test functionality, Deploy site}
Completed tasks: {Design mockups, Setup database}
Remaining tasks: {Write content, Test functionality, Deploy site}
Tasks completed: 2
Tasks remaining: 3
Progress: 40.0% complete
Status: Project in progress - 3 task(s) remaining

プロジェクト名が "Mobile App Development" で、計画されたタスクが "Create wireframes""Develop UI""Implement features" であり、完了したタスクが "Create wireframes""Develop UI""Implement features" の場合、プログラムは以下のように出力する必要があります:

Project: Mobile App Development
Planned tasks: {Create wireframes, Develop UI, Implement features}
Completed tasks: {Create wireframes, Develop UI, Implement features}
Remaining tasks: {}
Tasks completed: 3
Tasks remaining: 0
Progress: 100.0% complete
Status: Project completed successfully

プロジェクト名が "Marketing Campaign" で、計画されたタスクが "Research target audience""Create content""Design graphics""Launch campaign""Analyze results" であり、完了したタスクが "Research target audience" の場合、プログラムは以下のように出力する必要があります:

Project: Marketing Campaign
Planned tasks: {Research target audience, Create content, Design graphics, Launch campaign, Analyze results}
Completed tasks: {Research target audience}
Remaining tasks: {Create content, Design graphics, Launch campaign, Analyze results}
Tasks completed: 1
Tasks remaining: 4
Progress: 20.0% complete
Status: Project in progress - 4 task(s) remaining

プログラムでは、difference() メソッドを使用して、計画されたタスクの Set には存在するが、完了したタスクの Set には存在しないタスクを見つける必要があります。進捗率は、完了したタスクの数を計画されたタスクの総数で割り、100を掛けて計算し、小数点第1位で四捨五入してください。すべてのタスクが完了している場合は、ステータスとして "Project completed successfully" を表示し、それ以外の場合は "Project in progress - X task(s) remaining" (Xは残りのタスク数)を表示してください。

チートシート

difference()メソッドは、最初のセットに含まれていて、2番目のセットには含まれていない要素を含む新しいセットを作成します。

Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};

Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks);  // {meeting, report}

この操作はセットの引き算のようなものです。最初のセットから2番目のセットのすべての要素を削除し、元の両方のセットは変更せずに、残りの要素を含む新しいセットを返します。

自分で試してみよう

import 'dart:io';

void main() {
  // プロジェクト名を読み込む
  String? projectName = stdin.readLineSync();
  
  // "planned_done" まで計画されたタスクを読み込む
  Set<String> plannedTasks = <String>{};
  String? task;
  while ((task = stdin.readLineSync()) != "planned_done") {
    if (task != null) {
      plannedTasks.add(task);
    }
  }
  
  // "completed_done" まで完了したタスクを読み込む
  Set<String> completedTasks = <String>{};
  while ((task = stdin.readLineSync()) != "completed_done") {
    if (task != null) {
      completedTasks.add(task);
    }
  }
  
  // TODO: 以下にコードを記述してください
  // difference() メソッドを使用して残りのタスクを見つける
  // 進捗率を計算する
  // プロジェクトのステータスを判定する
  
  // 結果を出力する
  print("Project: $projectName");
  print("Planned tasks: $plannedTasks");
  print("Completed tasks: $completedTasks");
  // ここに残りの出力ステートメントを追加する
}
quiz icon腕試し

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

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