为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查切片中的元素并操作另一个切片(如果值存在或不存在)

如何检查切片中的元素并操作另一个切片(如果值存在或不存在)

Go
海绵宝宝撒 2023-07-17 16:25:33
我正在用 Go 编写一个程序,它应该检查切片的名称。如果该名称存在,则应在另一个切片中输入“YES”,如果不存在则应输入“NO”。名称切片应由用户输入,并且应在输入值时开始检查。我写了一些代码,但似乎不起作用。package mainimport (    "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 个空元素。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

第一个解决方案

这就是你想要的:


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您需要检查它。

第二:追加到数组必须在内循环之外。尝试使用 debugPrintln()来调试您的算法。

将代码移至单独的函数

为了清楚起见,我建议将存在性检查移至单独的函数:


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)

}

优化

在前面的代码中,我们在每次循环中将字符串数组传递给函数。如果数组更大,那就不好了,最好将指向字符串数组的指针传递给函数(或指向字符串的指针数组)。


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信