Поиск слов в массиве - PullRequest
0 голосов
/ 09 мая 2019

Как проверить, существует ли какое-либо из слов строки в массиве?

Например:

let arr = ["This", "is", "Array", "of", "String"]
let str = "The word String is exists"

Результат должен быть:

Найдено слов: "Строка", "есть"

Ответы [ 5 ]

2 голосов
/ 09 мая 2019

Вот менее наивное решение, которое будет работать для строк, содержащих пунктуацию.

Это сначала разбивает строку на слова, используя локализованные правила. Затем он находит пересечение двух массивов слов.

func findWords(text: String, words: [String]) -> [String] {
    var textWords: Set<String> = []
    text.enumerateSubstrings(in: text.startIndex..<text.endIndex, options: [.byWords, .localized]) { (word, _, _, _) in
        if let word = word {
            textWords.insert(word)
        }
    }

    let matches = textWords.intersection(words)

    return Array(matches)
}

print(findWords(text: "The word String is exists", words: ["This", "is", "Array", "of", "String"]))
print(findWords(text: "Hello there. How are you today?", words: ["there", "is", "today"]))

Выход:

["String", "is"]
["там", "сегодня"]

На момент написания статьи ни одно из других решений не работало для второго примера.

0 голосов
/ 10 мая 2019

Вы можете получить результат напрямую, установив пересечение:

let arr = ["This", "is", "Array", "of", "String"]
let str = "The word String is exists"
let separators = CharacterSet.alphanumerics.inverted
let result     = Set(arr).intersection(str.components(separatedBy: separators))
0 голосов
/ 09 мая 2019

Можно попробовать

let str = "The word String is exists"
let all = str.components(separatedBy:" ")
let arr = ["This", "is", "Array", "of", "String"]
let res =  arr.filter { all.contains($0) } // or contains(where
0 голосов
/ 09 мая 2019

Попробуйте следующее:

var resArray = [String]()
let wordArr = str.components(separatedBy: " ")
for s in wordArr {
     if arr.contains(s) {
       resArray.append(s)
    }
}
0 голосов
/ 09 мая 2019
let arr = ["This", "is", "Array", "of", "String"]
let str = "The word String is exists"
let set1 = Set(str.components(separatedBy: .whitespaces).filter { !$0.isEmpty })
let set2 = Set(arr)
let result = set1.intersection(set2)
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...