Menu
CoddyTech

遍历集合

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 36 课,共 68 课。

现在你已经可以向集合中添加、检查和删除元素了,是时候学习如何遍历所有元素了。由于你的 Go 集合基于映射构建,因此你可以使用熟悉的 for...range 循环访问每个元素。

要遍历集合,可以使用与遍历映射相同的语法,但你只需要关注键:

for color := range colors {
    fmt.Println(color)
}

注意,我们在范围循环中只使用了一个变量。因为我们不需要这些值(它们都是空结构体),所以可以完全忽略它们。这样会逐行打印集合中的每种颜色。

如果你想明确表示要忽略这个值,也可以使用双变量形式:

for color, _ := range colors {
    fmt.Println(color)
}

请记住,Go 中的映射在迭代时不保证任何特定顺序,因此每次运行程序时,集合中的元素都可能以不同的顺序打印出来。这是集合的正常行为,因为集合的设计用途是测试元素是否存在,而不是保持顺序。

challenge icon

挑战

简单

使用 Go 集合惯用写法构建一个音乐播放列表分析器,用于处理歌曲集合并显示每个播放列表的详细信息。这个挑战演示如何遍历集合来检查并报告其中的内容。

你会收到两个输入:

  • 一个包含摇滚歌曲的字符串,歌曲之间用逗号分隔(例如,"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine")
  • 一个包含流行歌曲的字符串,歌曲之间用逗号分隔(例如,"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")

你的任务是:

  1. 使用 Go 惯用写法 map[string]struct{} 创建两个集合,分别存储摇滚歌曲和流行歌曲
  2. 通过按逗号拆分两个输入字符串,解析出每首歌曲的标题
  3. 使用空结构体字面量 {} 作为值,将每首歌曲添加到对应的集合中
  4. 显示摇滚播放列表分析:
    • 标题:"Rock Playlist Analysis:"
    • 数量:"Total rock songs: [count]"
    • 歌曲标题:"Songs in rock playlist:"
    • 每首歌曲单独占一行:"♪ [song_title]"
  5. 显示流行播放列表分析:
    • 标题:"Pop Playlist Analysis:"
    • 数量:"Total pop songs: [count]"
    • 歌曲标题:"Songs in pop playlist:"
    • 每首歌曲单独占一行:"♪ [song_title]"
  6. 将两个集合合并到一个新集合中,创建一个合并后的播放列表
  7. 显示合并后的播放列表分析:
    • 标题:"Combined Playlist Analysis:"
    • 数量:"Total unique songs: [count]"
    • 歌曲标题:"All songs in combined playlist:"
    • 每首歌曲单独占一行:"♫ [song_title]"
  8. 最后,显示摘要:
    • "Playlist Summary:"
    • "Rock songs: [rock_count]"
    • "Pop songs: [pop_count]"
    • "Combined unique songs: [combined_count]"

使用 strings 库按逗号拆分输入字符串。要遍历每个集合,请使用只带一个变量的 for...range 循环,这样只会访问键(歌曲标题)。这个挑战演示了遍历 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:在下方编写你的代码
	// 将歌曲添加到各自的集合中
	// 显示摇滚播放列表的分析结果(对歌曲排序,确保输出顺序一致)
	// 显示流行播放列表的分析结果(对歌曲排序,确保输出顺序一致)
	// 创建并显示合并后播放列表的分析结果(对歌曲排序,确保输出顺序一致)
	// 显示播放列表汇总
	// 记住:将 map 的键转换为切片,排序后再遍历,确保顺序一致

	_ = rockSet
	_ = popSet
	_ = rockList
	_ = popList
	_ = fmt.Sprintf
	_ = sort.Strings
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器