go - 如何检查一个元素的切片并在值存在或不存在时操作另一个切片
问题描述
我正在用 Go 编写一个程序,它应该检查一个切片的名称。如果名称存在,则应在另一个切片中输入“YES”,如果不存在,则应输入“NO”。名称切片应由用户输入,并且应在输入值时开始检查。
我写了一些代码,但它似乎不起作用。
package main
import (
"fmt"
)
func main() {
var limit int
var names string
fmt.Scanln(&limit)
arr := make([]string, limit)
yn := make([]string, limit)
for i := 0; i < limit; i++ {
fmt.Scanln(&names)
for _, a := range arr {
if a == names {
yn = append(yn, "YES")
} else {
arr = append(arr, names)
yn = append(yn, "NO")
}
}
}
fmt.Println(yn)
}
输出应该像
用户输入的值:
5
史蒂夫
约翰
下雨
珍娜
约翰
输出:
不
不
不
不
是的
我得到的错误是一大堆 YES 和 NO 值,开头有 2 个空元素。
解决方案
第一个解决方案
这是你想要的:
func main() {
var limit int
var name string
_, err := fmt.Scanln(&limit)
if err != nil {
fmt.Println(err)
}
var names []string
var presence []string
for i := 0; i < limit; i++ {
_, err := fmt.Scanln(&name)
if err != nil {
fmt.Println(err)
}
var exist = false
for _, a := range names {
if a == name {
exist = true
break
}
}
if !exist {
names = append(names, name)
presence = append(presence, "NO")
} else {
presence = append(presence, "YES")
}
}
fmt.Println(presence)
}
- 首先Scanln返回
error
并且您需要检查它。 - 第二:追加到数组必须在内循环之外。尝试使用调试
Println()
来调试您的算法。
将代码移动到单独的函数
为了清楚起见,我提议将存在性检查转移到单独的功能:
func exists(a []string, element string) bool {
for _, e := range a {
if e == element {
return true
}
}
return false
}
func main() {
var limit int
var name string
_, err := fmt.Scanln(&limit)
if err != nil {
fmt.Println(err)
}
var names []string
var presence []string
for i := 0; i < limit; i++ {
_, err := fmt.Scanln(&name)
if err != nil {
fmt.Println(err)
}
if !exists(names, name) {
names = append(names, name)
presence = append(presence, "NO")
} else {
presence = append(presence, "YES")
}
}
fmt.Println(presence)
}
优化
在前面的代码中,我们在每个循环中每次都将字符串数组传递给函数。如果数组更大,那就不好了,最好将指向字符串数组的指针传递给函数(或指向字符串的指针数组)。
推荐阅读
- reactjs - material-ui fab href 不添加 baseurl
- python - 如何将 str 数字转换为列表中的 int 类型?
- templates - Blogger Emporio Templete:在主页片段上添加第二行文字
- sql - SQL - 获取正值的最大值和负值的最小值
- python - 如何使用逻辑回归预测输出值?
- python-3.x - 启动新创建的 Django 应用程序时出现语法错误
- angular - TypeScript 编译中缺少 in-memory-data.service.ts
- sockets - UDP 提供什么保证?
- github - 如何下载推送的 Odoo 版本并上传到 Github
- c++ - 使用 Pimpl 隐藏库依赖项似乎没有任何作用