セットの作成
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 32/68。
Goのセットイディオムの背後にある概念を理解したところで、最初のセットを作成して実践してみましょう。そのプロセスは単純で、すでにマップで学んだのと同じパターンに従います。
Goでセット(集合)を作成するには、map[T]struct{}パターンを使用して変数を宣言します。ここで、Tは格納したい要素の型です。一意の色の名前を格納するためのセットを作成する方法は次のとおりです:
colors := make(map[string]struct{})また、マップリテラル構文を使用して、いくつかの初期値でセットを初期化することもできます。
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}各値が空の構造体リテラル {} であることに注目してください。これにより struct{} のゼロ値が作成されます。これはメモリ空間を一切消費しませんが、マップ内にキーを存在させることができます。
このアプローチの素晴らしい点は、Goの既存のmapインフラストラクチャを活用しながら、真のsetセマンティクスを提供できることです。各カラー名は一度しか登録できず、通常のmapと同様に高速なルックアップが可能です。
チャレンジ
簡単一意のアイテムを格納するための Go 言語のセット・イディオムを実証する、プログラミング言語の嗜好トラッカーを作成してください。このチャレンジでは、map[string]struct{} パターンを使用して、重複なしでプログラミング言語を追跡する方法を示します。
2 つの入力を受け取ります:
- 処理する言語の数を表す文字列(例:
"6") - カンマで区切られたプログラミング言語を含む文字列(例:
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
あなたのタスクは以下の通りです:
- Go 言語のイディオムである
map[string]struct{}を使用して、一意のプログラミング言語を格納するセットを作成します。 - 入力文字列をカンマで分割して解析し、個々の言語名を取得します。
- 空の構造体リテラル
{}を値として使用し、各言語をセットに追加します。 - 各言語が検出されるたびに、以下の形式で処理結果を表示します:
- その言語がセットに新しく追加される場合:
"Added: [language]" - その言語がすでにセットに存在する場合:
"Already exists: [language]"
- その言語がセットに新しく追加される場合:
- すべての言語を処理した後、サマリーを表示します:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- 最後に、セット内の一意の言語をすべてリストします:
- ヘッダー:
"Programming languages in set:" - 各言語を個別の行に表示:
"- [language]"
- ヘッダー:
入力文字列の分割には strings パッケージを、カウント文字列の整数への変換には strconv パッケージを使用してください。言語をセットに追加する前に、その言語がすでに存在するかどうかを確認するには、comma ok イディオム _, exists := languageSet[language] を使用します。このチャレンジは、Go 言語のセット・イディオムが、一意のアイテムを追跡し、データ内の重複を防ぐための効率的な方法をどのように提供するかを示しています。
自分で試してみよう
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// 入力を読み込む
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// カウント文字列を整数に変換する(このチャレンジでは不要)
_, _ = strconv.Atoi(countStr)
// 言語の文字列をカンマで分割する
languages := strings.Split(languagesStr, ",")
// map[string]struct{} イディオムを使用してセットを作成する
languageSet := make(map[string]struct{})
// TODO: 以下にコードを記述してください
// 各言語を処理し、セット内に存在するかどうかを確認する
// comma ok イディオムを使用する: _, exists := languageSet[language]
// "Added: [language]" または "Already exists: [language]" を出力する
// 空の構造体リテラル {} を使用して言語をセットに追加する
// 要約情報を出力する
// 処理された言語の総数とユニークな言語の数を出力する
// セット内のすべてのユニークな言語を出力する
fmt.Println("Programming languages in set:")
// 一貫した出力のために、map を slice に変換してソートします
// 各言語を "- [language]" 形式でリスト表示します
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。