如何移除other_names中与names元素匹配的嵌套切片?
修正Go语言嵌套切片的元素删除逻辑
原代码存在的问题
- 变量名错误:代码中使用了未定义的
copies变量,实际应指向other_names - 删除逻辑漏洞:仅通过
origl = copies[v][:d]截取前d个元素,会丢失d之后未匹配的元素,且未处理多层嵌套结构 - 结构丢失:最终输出的是单个二维切片,没有还原原有的三维切片结构
修正后的代码
func Duplicate() { var names = [][]string{ {"Malder", "Carl"}, {"Adam", "Kent"}, } var other_names = [][][]string{ { {"Sony", "Bond"}, {"Adam", "Kent"}, {"Piter", "Nina"}, }, } // 把names中需要匹配的第二个元素存入map,实现快速查询 matchSet := make(map[string]bool) for _, name := range names { matchSet[name[1]] = true } // 构建处理后的嵌套切片结果 processed := make([][][]string, len(other_names)) for groupIdx, group := range other_names { filtered := make([][]string, 0, len(group)) for _, item := range group { // 仅保留第二个元素不在匹配集合中的项 if !matchSet[item[1]] { filtered = append(filtered, item) } } processed[groupIdx] = filtered } // 输出符合预期的结果 fmt.Println(processed) }
代码说明
- 查询效率优化:用map存储需要匹配的元素值,将单次查询的时间复杂度从O(n)降到O(1),避免多层嵌套循环的低效遍历
- 结构完整性保留:遍历原三维切片的每一层分组,对每个分组内的元素逐一过滤,最终还原原有的嵌套结构
- 安全的切片操作:通过
append构建新切片,避免修改原切片的底层数组,同时确保所有不匹配的元素都被正确保留
执行修正后的代码,会得到预期的结果:
[[[Sony Bond] [Piter Nina]]]
内容的提问来源于stack exchange,提问作者SonyMag
相关产品推荐
相关产品推荐

