Как я могу проверить, содержит ли текстовый файл целое слово? - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь проверить, содержит ли текстовый файл определенное слово. Однако он вернет истину даже для некоторых букв в строке. Например:

Введенная строка: gdo

Компьютер найден: род гдо м

var word = strings.ToLower(string(a))

// read the whole file at once
b, err := ioutil.ReadFile("words.txt")
if err != nil {
    panic(err)
}
s := string(b)

// Check whether s contains substring text
if strings.Contains(s, word) == true {
    fmt.Println("this is a word ", word)
} else {
    fmt.Println("this isn't a word ", word)
}

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Вот простое решение.Вы можете конвертировать s в массив строк.Затем выполните цикл по массиву, чтобы проверить, содержит ли оно слово.

var word = strings.ToLower(string(a))

// read the whole file at once
b, err := ioutil.ReadFile("words.txt")
if err != nil {
    panic(err)
}
s := string(b)

// convert the string into a string array (words)

content := strings.Split(s, " ")

contains := false

for i:=0 ; i<len(content) ; i++ {
    if content[i] == word {
        contains = true
        break
    }
}

// Check whether s contains substring text
if contains {
    fmt.Println("this is a word ", word)
} else {
    fmt.Println("this isn't a word ", word)
}

Не нужно усложнять вещи.Хорошего дня:)

0 голосов
/ 23 апреля 2019

strings.Contains() сообщает, содержится ли в строке подстрока.Он не проверяет границы слов, поэтому ожидаемое поведение ожидается.

Вместо этого вам нужно распознавать каждое слово как слово.Уже есть функция strings.Fields() для разделения текста по пробелам.Простая реализация может выглядеть так:

func main() {
    source := `
hello
world
kingdom
foo
`
    check := "gdo"
    words := strings.Fields(strings.ToLower(source))

    for _, w := range words {
        if w == check {
            fmt.Println("found", check)
            break
        }
    }
}

Я использовал strings.Fields(), потому что я не знаю содержимого вашего words.txt файла.Вы также можете использовать strings.Split(), если вы знаете, что разделитель всегда представляет собой одну новую строку или один пробел.

Это будет медленным, если вы выполняете много поисков, так как он зацикливается на массиве wordsдля каждого поиска.Более быстрый метод - сохранить его на карте:

func main() {
    source := `
hello
world
kingdom
foo
`
    check := "gdo"

    words := make(map[string]struct{})
    for _, w := range strings.Fields(strings.ToLower(source)) {
        words[w] = struct{}{}
    }

    _, ok := words[check]
    if ok {
        fmt.Println("found", check)
    }
}

Если вы выполняете только один поиск, первый метод будет быстрее (так как этот метод карты всегда должен будет зацикливать весь массив вхотя бы один раз для построения карты).

Я использовал несколько странно выглядящую пустую структуру для значения карты, поскольку это не выделяет никакой памяти (words[w] = true будет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...