首页 > 解决方案 > 如何检查一个元素的切片并在值存在或不存在时操作另一个切片

问题描述

我正在用 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 个空元素。

标签: go

解决方案


第一个解决方案

这是你想要的:

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)
}

优化

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


推荐阅读