唯一项收集器
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 68 课,共 68 课。
挑战
简单创建一个使用 Go 惯用集合模式的去重系统,从字符串集合中过滤出唯一项。这项挑战将测试你使用 map[string]struct{} 惯用写法追踪已见项,并构建只包含唯一元素的集合的能力。
你会收到两个输入:
- 一个字符串,其中的项以逗号分隔(例如,
"apple,banana,apple,orange,banana,grape,apple") - 一个字符串,其中包含要合并的其他项,同样以逗号分隔(例如,
"kiwi,apple,mango,banana,kiwi")
你的任务是:
- 创建一个名为
getUniqueItems的函数,接收一个字符串切片,并返回一个只包含唯一字符串的新切片 - 在这个函数中,使用
map[string]struct{}惯用写法追踪哪些项已经出现过 - 遍历输入切片,并对每一项执行以下操作:
- 使用逗号 ok 惯用写法检查集合中是否存在该项
- 如果该项之前没有出现过,就将它添加到集合和结果切片中
- 通过按逗号拆分第一个输入,获取初始项列表
- 通过按逗号拆分第二个输入,获取其他项
- 显示系统标题:
"=== UNIQUE ITEM COLLECTOR ===" - 显示原始项:
"Original items: [comma-separated list of all original items]" - 显示其他项:
"Additional items: [comma-separated list of all additional items]" - 使用
getUniqueItems函数获取原始列表中的唯一项 - 显示原始列表中的唯一项:
"Unique original items: [comma-separated list of unique items from original list]" - 将两个输入切片合并为一个包含所有项的切片
- 使用
getUniqueItems函数获取合并列表中的唯一项 - 显示最终的唯一项:
"Final unique items: [comma-separated list of all unique items]" - 显示集合统计信息:
"=== COLLECTION STATISTICS ===""Total original items: [count of original items]""Total additional items: [count of additional items]""Total combined items: [count of all items combined]""Unique items found: [count of unique items]""Duplicates removed: [total combined items minus unique items]"
- 显示完成消息:
"Unique item collection completed successfully"
使用 strings 包拆分输入字符串,并使用 fmt 包输出。合并项以供显示时,使用 strings.Join,并以逗号作为分隔符。这项挑战展示了 Go 的集合惯用写法如何高效解决从集合中移除重复项这一常见问题。你会在数据处理应用中经常用到这种模式。
亲手试试
package main
import (
"fmt"
"strings"
)
func main() {
// 读取输入
var input1 string
var input2 string
fmt.Scanln(&input1)
fmt.Scanln(&input2)
// 将输入字符串解析为切片
originalItems := strings.Split(input1, ",")
additionalItems := strings.Split(input2, ",")
// TODO:在这里编写你的代码
// 1. 创建使用 map[string]struct{} 惯用写法的 getUniqueItems 函数
// 2. 处理原始元素,获取不重复的元素
// 3. 合并两个切片,从合并后的列表中获取不重复的元素
// 4. 计算统计数据
// 显示系统标题
fmt.Println("=== UNIQUE ITEM COLLECTOR ===")
// 显示原始元素和新增元素
fmt.Printf("Original items: %s\n", strings.Join(originalItems, ","))
fmt.Printf("Additional items: %s\n", strings.Join(additionalItems, ","))
// TODO:显示原始元素中不重复的元素、最终不重复的元素和统计数据
// 使用 fmt.Printf 和 strings.Join 设置输出格式
}逻辑与流程中的所有课
自己练习: Go 在线编译器