Искать несколько слов, игнорируя порядок в Swift - PullRequest
0 голосов
/ 16 января 2019

В настоящее время у меня есть UITextField, где я могу ввести строку поиска, и она вернет любую строку в массиве, содержащем этот текст, в указанном порядке. Однако я хочу сделать возможным поиск по каждому слову и игнорировать порядок строк в массиве.

var results = [String]()
let filterArray = ["Big green bubble", "Red bubble", "A bubble in green", "Small green bubble", "This bubble is green"]     
let textString = "green bubble" 
for i in 0 ..< filterArray.count { 
    let checkString = filterArray[i] 
    let filterRange = (checkString as NSString).range(of: textString, options: .caseInsensitive) 
    if filterRange.location != NSNotFound { 
        results.append(checkString) 
    }
}  
print(results) // returns ["Big green bubble", "Small green bubble"]

Хотелось бы, чтобы оно также включало "Зеленый пузырь" и "Этот зеленый пузырь" , потому что он содержит каждое слово, которое я ищу. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

let filterArray = ["Big green bubble", "Red bubble", "A bubble in green", "Small green bubble", "This bubble is green"]
let textString = "green bubble"
let wordsSet = Set(textString.components(separatedBy: " "))
let queryResult = filterArray.filter {
    Set($0.components(separatedBy: " ")).intersection(wordsSet).count == wordsSet.count
}
queryResult  // "Big green bubble", "A bubble in green", "Small green bubble", "This bubble is green"]

Если вам нужен регистр без учета регистра, вы можете отобразить все слова в нижний регистр:

let wordsSet = Set(textString.lowercased().components(separatedBy: " "))
let queryResult = filterArray
    .map { $0.lowercased() }
    .filter {
    Set($0.components(separatedBy: " "))
        .intersection(wordsSet).count == wordsSet.count
}
0 голосов
/ 16 января 2019

Просто отфильтруйте элементы из filterArray, который содержит оба этих слова

let filterArray = ["Big green bubble", "Red bubble", "A bubble in green", "Small green bubble", "This bubble is green"]
let textString = "green bubble".lowercased()
let words = textString.components(separatedBy: " ")
let results = filterArray.map { $0.lowercased() }.filter { string in words.allSatisfy { string.components(separatedBy: " ").contains($0) } }

print(results) /* ["Big green bubble", "A bubble in green", "Small green bubble", "This bubble is green"] */
...