Kotlin 在字符串列表中查找子字符串

fkv*_*tak 4 string search android list kotlin

我有一个字符串,它是产品名称:

\n\n
val productName = "7 UP pov.a. 0,25 (24)"\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一个字符串是用户在搜索栏中输入的,比方说:

\n\n
val userInput = "up 0,25"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用此方法规范 ProductName 和 userInput:

\n\n
private fun normalizeQuery(query: String): List<String> {\n\n    val list = Normalizer.normalize(query.toLowerCase(), Normalizer.Form.NFD)\n            .replace("\\\\p{M}".toRegex(), "")\n            .split(" ")\n            .toMutableList()\n\n    for (word in list) if (word == " ") list.remove(word)\n\n    return list\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我有 2 个标准化字符串列表(一切都是小写,没有空字符,也没有重音字母,例如 \xc4\x8c -> c、\xc5\xbd -> z、\xc5\xbe -> z、\xc5\ xa1 -> s、\xc4\x87 -> c 等):

\n\n
product = [7, up, pov.a., 0,25, (24)]\ninput = [up, 0,25]\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想(为了这些示例中的简单起见)如果产品中的字符串包含输入中的每个字符串(但即使作为子字符串) ,则返回 true ,例如

\n\n
input = [0,2, up] -> true\ninput = [up, 25] -> true\ninput = [pov, 7] -> true\ninput = [v.a., 4), up] -> true\n
Run Code Online (Sandbox Code Playgroud)\n\n

想要输出的另一个例子:

\n\n
product = [this, is, an, example, product, name]\ninput = [example, product] -> true\ninput = [mple, name] -> true\ninput = [this, prod] -> true\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过的:

\n\n

A)简单有效的方法?

\n\n
if (product.containsAll(input)) outputList.put(key, ActivityMain.products!![key]!!)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,只有当输入包含与产品中完全相同的字符串时,这才给我想要的东西,例如:

\n\n
product = [this, is, an, example, product, name]\ninput = [example, product] -> true\ninput = [an, name] -> true\ninput = [mple, name] -> false\ninput = [example, name] -> true\ninput = [this, prod] -> false\n
Run Code Online (Sandbox Code Playgroud)\n\n

B)复杂的方式,给了我我想要的,但有时会出现不需要的结果:

\n\n
val wordCount = input.size\nvar hit = 0\n\nfor (word in input)\n   for (word2 in product) \n      if (word2.contains(word))\n         hit++\n\nif (hit >= wordCount) \n    outputList.put(key, ActivityMain.products!![key]!!)\n\nhit = 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

帮我把那些假的变成真:)

\n

Kev*_*tel 6

怎么样:

fun match(product: Array<String>, terms: Array<String>): Boolean {
    return terms.all { term -> product.any { word -> word.contains(term) } }
}
Run Code Online (Sandbox Code Playgroud)

通过测试:

import java.util.*

fun main(args: Array<String>) {
    val product = arrayOf("this", "is", "an", "example", "product", "name")
    val tests = mapOf(
        arrayOf("example", "product") to true,
        arrayOf("an", "name") to true,
        arrayOf("mple", "name") to true,
        arrayOf("example", "name") to true,
        arrayOf("this", "prod") to true
    )

    tests.forEach { (terms, result) ->
        System.out.println(search(product, terms) == result)
    }
}

fun match(product: Array<String>, terms: Array<String>): Boolean {
    return terms.all { term -> product.any { word -> word.contains(term) } }
}
Run Code Online (Sandbox Code Playgroud)

您还有其他不起作用的示例/测试吗?

  • 你的“匹配”方法非常有效,非常感谢你,我从现在开始就使用这种方法 (2认同)