Menu
Coddy logo textTech

セットの作成

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と同様に高速なルックアップ時間を実現できます。

quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

challenge icon

チャレンジ

簡単

一意のアイテムを格納するための Go 言語のセット・イディオムを実証する、プログラミング言語の嗜好トラッカーを作成してください。このチャレンジでは、map[string]struct{} パターンを使用して、重複なしでプログラミング言語を追跡する方法を学びます。

2 つの入力を受け取ります:

  • 処理する言語の数を表す文字列(例:"6"
  • カンマで区切られたプログラミング言語を含む文字列(例:"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript"

あなたのタスクは以下の通りです:

  1. Go のイディオムである map[string]struct{} を使用して、一意のプログラミング言語を格納するセットを作成します。
  2. 入力文字列をカンマで分割して、個々の言語名を取得します。
  3. 空の構造体リテラル {} を値として使用し、各言語をセットに追加します。
  4. 各言語が処理されるたびに、以下の形式で処理結果を表示します:
    • 言語がセットに新しく追加される場合:"Added: [language]"
    • 言語が既にセットに存在する場合:"Already exists: [language]"
  5. すべての言語を処理した後、サマリーを表示します:
    • "Total languages processed: [total_count]"
    • "Unique languages: [unique_count]"
  6. 最後に、セット内の一意の言語をすべてリストします:
    • ヘッダー:"Programming languages in set:"
    • 各言語を個別の行に表示:"- [language]"

入力文字列の分割には strings パッケージを、カウント文字列の整数への変換には strconv パッケージを使用してください。言語をセットに追加する前に既に存在するかどうかを確認するには、comma ok イディオム _, exists := languageSet[language] を使用します。このチャレンジは、Go のセット・イディオムがいかに効率的に一意のアイテムを追跡し、データ内の重複を防ぐかを示しています。

チートシート

Goでセットを作成するには、map[T]struct{}パターンを使用します。ここで、Tは要素の型です:

colors := make(map[string]struct{})

マップリテラル構文を使用して、初期値でセットを初期化することもできます:

colors := map[string]struct{}{
    "red":   {},
    "blue":  {},
    "green": {},
}

各値は空の構造体リテラル {} であり、これは struct{} のゼロ値を作成し、メモリ空間を消費せずにマップ内にキーを存在させることができます。

要素がセット内に存在するかどうかを確認するには、comma okイディオムを使用します:

_, exists := languageSet[language]

自分で試してみよう

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:")
	// 一貫した出力のためにマップをスライスに変換してソートします
	// 各言語を "- [language]" 形式でリストします
}
quiz icon腕試し

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

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