積集合
CoddyのDartジャーニー「論理とフロー」セクションの一部 — レッスン 23/65。
2つのSetコレクションの両方に存在する要素を見つける必要がある場合、intersection()メソッドが最適な解決策を提供します。この操作は2つのセット間の共通要素を特定し、両方の元のコレクションに存在する項目のみを含む新しいセットを作成します。
intersection()メソッドは、2つのセットの要素を比較し、共有されている値のみを含む新しいセットを返すことで機能します。他のセット操作と同様に、一意性を自動的に処理するため、共通する各要素は結果に一度だけ現れます。
Set<String> aliceFriends = {'Bob', 'Charlie', 'Diana', 'Eve'};
Set<String> bobFriends = {'Alice', 'Charlie', 'Frank', 'Diana'};
Set<String> mutualFriends = aliceFriends.intersection(bobFriends);
print(mutualFriends); // {Charlie, Diana}この操作は、ユーザー間の共通の関心事、チーム内での共有スキル、またはフィルタリング操作における一致条件など、データ内の重複を見つけるのに特に役立ちます。積集合(インターセクション)は、2つのコレクションに共通する要素を特定するのに役立ち、比較や分析のタスクにおいて非常に有用です。
チャレンジ
簡単2人のユーザー間の共通のつながりを見つけることで、ソーシャルメディアプラットフォームを管理するプログラムを作成してください。プログラムは以下の手順で行う必要があります:
- 1人目のユーザー名を表す文字列入力を読み込む
- 1人目のユーザーのつながりを表す複数の文字列入力を読み込む(入力は
"user1_done"を受け取った時点で終了します) - 2人目のユーザー名を表す文字列入力を読み込む
- 2人目のユーザーのつながりを表す複数の文字列入力を読み込む(入力は
"user2_done"を受け取った時点で終了します) - 各ユーザーのつながりを保存するために、2つの別々の Set を作成する
intersection()メソッドを使用して、両方のユーザー間の共通のつながりを見つける- 以下の形式で、つながりの分析結果を出力する
例えば、1人目のユーザーが "Alice" で、つながりが "Bob", "Charlie", "Diana", "Eve" であり、2人目のユーザーが "Bob" で、つながりが "Alice", "Charlie", "Frank", "Diana" の場合、プログラムは以下のように出力する必要があります:
User Analysis: Finding mutual connections
Alice's connections: {Bob, Charlie, Diana, Eve}
Bob's connections: {Alice, Charlie, Frank, Diana}
Mutual connections: {Charlie, Diana}
Total mutual connections: 2
Connection strength: Strong (2+ mutual connections)
Status: Users have mutual connectionsもし1人目のユーザーが "Sarah" で、つながりが "John", "Mike", "Lisa" であり、2人目のユーザーが "Tom" で、つながりが "Emma", "David", "Kate" の場合、プログラムは以下のように出力する必要があります:
User Analysis: Finding mutual connections
Sarah's connections: {John, Mike, Lisa}
Tom's connections: {Emma, David, Kate}
Mutual connections: {}
Total mutual connections: 0
Connection strength: None (no mutual connections)
Status: Users have no mutual connectionsもし1人目のユーザーが "Emma" で、つながりが "Alex", "Jordan", "Taylor", "Morgan" であり、2人目のユーザーが "Jordan" で、つながりが "Emma", "Taylor", "Casey" の場合、プログラムは以下のように出力する必要があります:
User Analysis: Finding mutual connections
Emma's connections: {Alex, Jordan, Taylor, Morgan}
Jordan's connections: {Emma, Taylor, Casey}
Mutual connections: {Taylor}
Total mutual connections: 1
Connection strength: Weak (1 mutual connection)
Status: Users have mutual connectionsプログラムでは、2つのユーザー Set 間の共通のつながりを見つけるために intersection() メソッドを使用する必要があります。共通のつながりの数に基づいて、つながりの強さを決定してください:共通のつながりが0の場合は "None"、ちょうど1つの場合は "Weak"、2つ以上の場合は "Strong" とします。共通のつながりがある場合はステータスとして "Users have mutual connections" を表示し、そうでない場合は "Users have no mutual connections" を表示してください。
チートシート
intersection()メソッドは、2つのセット間の共通要素を見つけ、共有されている値のみを含む新しいセットを返します。
Set<String> aliceFriends = {'Bob', 'Charlie', 'Diana', 'Eve'};
Set<String> bobFriends = {'Alice', 'Charlie', 'Frank', 'Diana'};
Set<String> mutualFriends = aliceFriends.intersection(bobFriends);
print(mutualFriends); // {Charlie, Diana}この操作は一意性を自動的に処理し、共通の関心事、共有されたスキル、フィルタリング操作における一致条件など、データの重複を見つけるのに役立ちます。
自分で試してみよう
import 'dart:io';
void main() {
// 1人目のユーザー名を読み込む
String? user1Name = stdin.readLineSync();
// "user1_done" が入力されるまで1人目のユーザーのつながりを読み込む
Set<String> user1Connections = <String>{};
String? connection;
while ((connection = stdin.readLineSync()) != "user1_done") {
if (connection != null) {
user1Connections.add(connection);
}
}
// 2人目のユーザー名を読み込む
String? user2Name = stdin.readLineSync();
// "user2_done" が入力されるまで2人目のユーザーのつながりを読み込む
Set<String> user2Connections = <String>{};
while ((connection = stdin.readLineSync()) != "user2_done") {
if (connection != null) {
user2Connections.add(connection);
}
}
// TODO: 以下にコードを記述してください
// intersection() メソッドを使用して共通のつながりを見つける
// 共通のつながりの数に基づいて、つながりの強さを決定する
// 必要な出力形式を生成する
// 分析結果を出力する
print("User Analysis: Finding mutual connections");
// ここに出力文を追加してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー