セットからの削除
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 35/68。
セットから要素を削除する必要がある場合があります。Goでは組み込みの delete() 関数を使用して、これを簡単に行うことができます。セットの実体は内部的にはマップであるため、要素の削除は、マップからキーを削除するのとまったく同じように機能します。
セットから要素を削除するには、delete() 関数にセットと削除したい要素を指定して使用します:
delete(colors, "red")delete() 関数は、マップ(あなたのセット)と削除したいキーの2つのパラメータを受け取ります。要素がセット内に存在する場合、その要素は削除されます。要素が存在しない場合、関数は何もしません。エラーはスローされません。
この動作は、要素が最初から存在していたかどうかにかかわらず、要素が存在しないことを確実にしたい場合が多いため、セット(集合)に最適です。この操作は高速かつ効率的であり、Goの基盤となるマップ実装のパフォーマンス上の利点を維持しています。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単Goのセットの慣習(set idiom)を使用して、異なるジャンルのコレクションから本を削除するライブラリ本管理システムを構築してください。このチャレンジでは、削除プロセスを追跡しながら、delete()関数を使用してセットから要素を削除する方法を学びます。
2つの入力を受け取ります:
- フィクションコレクションに含まれる本をカンマで区切った文字列(例:
"1984,Dune,Foundation,Neuromancer,Brave New World") - 削除する本をカンマで区切った文字列(例:
"Dune,Harry Potter,Foundation,Twilight,1984")
あなたのタスクは以下の通りです:
- Goの慣習である
map[string]struct{}を使用して、フィクションの本を保存するためのセットを作成する - 最初の入力文字列をカンマで分割して、個々の本のタイトルを取得し、パースする
- 空の構造体リテラル
{}を値として使用し、各本をセットに追加する - 2番目の入力文字列をカンマで分割して、削除する本のリストを取得し、パースする
- 削除する各本について、comma okイディオムを使用してセット内に存在するかどうかを確認する
- 処理される各本の削除プロセスを表示する:
- 本がコレクションに存在する場合:
"Removing: [book_title]" - 本がコレクションに存在しない場合:
"Not found: [book_title]"
- 本がコレクションに存在する場合:
delete()関数を使用して、セットに存在する本を削除する- すべての削除リクエストを処理した後、サマリーを表示する:
"Initial collection size: [initial_count]""Removal requests: [requests_count]""Books successfully removed: [removed_count]""Books not found: [not_found_count]""Final collection size: [final_count]"
- 最後に、コレクションに残っているすべての本をリスト表示する:
- ヘッダー:
"Remaining books in fiction collection:" - 各本を個別の行に表示:
"- [book_title]" - 本が残っていない場合:
"- Collection is empty"
- ヘッダー:
入力文字列をカンマで分割するには、stringsパッケージを使用してください。このチャレンジは、delete()関数がGoのセットから要素を安全に削除する方法を示しています。存在しない要素を削除しようとしてもエラーはスローされないため、クリーンアップ操作に最適です。
チートシート
Goでセットから要素を削除するには、組み込みの delete() 関数を使用します:
delete(colors, "red")delete() 関数は、マップ(あなたのセット)と削除したいキーの2つのパラメータを受け取ります。要素が存在する場合、それは削除されます。存在しない場合、関数は何もしません。エラーはスローされません。
これにより、要素が最初から存在していたかどうかにかかわらず、要素が存在しないことを確実にしたい場合が多いため、delete() はセットに最適です。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// スペースを含む本のタイトルをサポートするためにScannerを使用して入力を読み込む
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fictionBooks := scanner.Text()
scanner.Scan()
booksToRemove := scanner.Text()
// 入力文字列を解析する
fictionList := strings.Split(fictionBooks, ",")
removeList := strings.Split(booksToRemove, ",")
// TODO: 以下にコードを記述してください
// 1. フィクション本を保存するために map[string]struct{} を使用してセットを作成する
// 2. fictionList から各本をセットに追加する
// 3. removeList の各本を処理し、存在するかどうかを確認する
// 4. 削除プロセスを表示し、delete() 関数を使用する
// 5. 要約統計を表示する
// 6. コレクションに残っている本をリストアップする
// 一貫した出力のために、残りの本をソートすることを忘れないでください
_ = sort.Strings // sortを使用したらこの行を削除してください
_ = fmt.Println // fmtを使用したらこの行を削除してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。