セットの反復処理
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 36/68。
セットに要素を追加、確認、削除できるようになったので、次はすべての要素を反復処理する方法を学びましょう。Goのセットはマップを基に構築されているため、おなじみの for...range ループを使用して各要素にアクセスできます。
Setを反復処理するには、Mapを反復処理するのと同じ構文を使用しますが、キーのみを考慮します:
for color := range colors {
fmt.Println(color)
}range ループで変数を1つだけ使用していることに注目してください。値(これらはすべて空の構造体です)は必要ないため、完全に無視することができます。これにより、セット内の各色が1行に1つずつ出力されます。
値を無視することを明示したい場合は、二変数形式を使用することもできます:
for color, _ := range colors {
fmt.Println(color)
}Goのマップは、イテレーション(反復処理)の際に特定の順序を保証しないことに注意してください。そのため、プログラムを実行するたびに、セットの要素が異なる順序で出力される可能性があります。これはセット(集合)としては完全に正常な動作です。セットは順序を維持することではなく、メンバーシップ・テスト(要素の存在確認)のために設計されているからです。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単Goのセット(集合)のイディオムを使用して、曲のコレクションを処理し、各プレイリストに関する詳細情報を表示するミュージックプレイリストアナライザーを構築します。このチャレンジでは、セットを反復処理してその内容を調査し、レポートする方法を学びます。
2つの入力を受け取ります:
- カンマで区切られたロックの曲を含む文字列(例:
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - カンマで区切られたポップの曲を含む文字列(例:
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
あなたのタスクは以下の通りです:
- Goのイディオムである
map[string]struct{}を使用して、ロックの曲とポップの曲を別々に保存するための2つのセットを作成します。 - 両方の入力文字列をカンマで分割して、個々の曲のタイトルを取得し、解析します。
- 空の構造体リテラル
{}を値として使用し、各曲を適切なセットに追加します。 - ロックプレイリストの分析を表示します:
- ヘッダー:
"Rock Playlist Analysis:" - カウント:
"Total rock songs: [count]" - 曲のヘッダー:
"Songs in rock playlist:" - 各曲を個別の行に表示:
"♪ [song_title]"
- ヘッダー:
- ポッププレイリストの分析を表示します:
- ヘッダー:
"Pop Playlist Analysis:" - カウント:
"Total pop songs: [count]" - 曲のヘッダー:
"Songs in pop playlist:" - 各曲を個別の行に表示:
"♪ [song_title]"
- ヘッダー:
- 両方のセットを新しいセットにマージして、統合プレイリストを作成します。
- 統合プレイリストの分析を表示します:
- ヘッダー:
"Combined Playlist Analysis:" - カウント:
"Total unique songs: [count]" - 曲のヘッダー:
"All songs in combined playlist:" - 各曲を個別の行に表示:
"♫ [song_title]"
- ヘッダー:
- 最後に、サマリーを表示します:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
入力文字列をカンマで分割するには strings パッケージを使用してください。各セットを反復処理するには、単一の変数を持つ for...range ループを使用して、キー(曲のタイトル)のみにアクセスします。このチャレンジは、Goのセットを反復処理することでコレクション内のすべての要素を調査できることを示しており、分析やレポートのタスクに最適です。
チートシート
Goでセットを反復処理するには、キーのみにアクセスするために、単一の変数を使用してfor...rangeループを使用します:
for color := range colors {
fmt.Println(color)
}また、2つの変数を使用する形式を使用して、明示的に値を無視することもできます:
for color, _ := range colors {
fmt.Println(color)
}Goのマップは反復処理時に特定の順序を保証しないため、プログラムを実行するたびにセットの要素が異なる順序で表示される可能性があることに注意してください。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// bufio.Scannerを使用して行全体を読み取ります(スペースを含む曲名に対応)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// Goの慣用句である map[string]struct{} を使用してセットを作成します
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// 入力文字列を解析し、セットにデータを入れます
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO: 以下にコードを記述してください
// 各セットに曲を追加します
// ロックのプレイリスト分析を表示します(出力を一定にするために曲をソートします)
// ポップのプレイリスト分析を表示します(出力を一定にするために曲をソートします)
// 統合されたプレイリスト分析を作成して表示します(出力を一定にするために曲をソートします)
// プレイリストの概要を表示します
// 注意:順序を一定にするために、マップのキーをスライスに変換し、ソートしてから反復処理を行ってください
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。