【问题标题】:Checking if values in List is part of String检查 List 中的值是否是 String 的一部分
【发布时间】:2013-04-09 09:29:12
【问题描述】:

我有一个这样的字符串:

val a = "some random test message"

我有一个这样的列表:

val keys = List("hi","random","test")

现在,我想检查字符串 a 是否包含来自 keys 的任何值。我们如何使用 Scala 的内置库函数来做到这一点?

(我知道将a 拆分为 List 的方法,然后使用keys list 进行检查,然后找到解决方案。但我正在寻找一种更简单地使用标准库函数来解决它的方法。)

【问题讨论】:

    标签: string scala list


    【解决方案1】:

    这样的?

    keys.exists(a.contains(_)) 
    

    或者更惯用的

    keys.exists(a.contains)
    

    【讨论】:

    • keys exists a.contains
    • 根据 OP 的需要,val keys = List("mess") 将产生可能是误报的结果。 keys.exists(a.split(' ').contains) 可能更准确。
    • 这个解决方案很棒,但我很难理解它。你们能帮帮我吗?
    • @KirdApe 这只是keys.exists(key => a.contains(key))的快捷方式
    • 作为此的扩展,返回在字符串中找到的列表项的列表的代码是什么,而不仅仅是一个是否存在的布尔值?
    【解决方案2】:

    简单的情况是测试子串包含(如rarry's answer中所述),例如

    keys.exists(a.contains(_)) 
    

    你没有说你是否真的想找到整个单词匹配。由于rarry 的回答假设您没有,这里有一个假设您这样做的替代方案。

    val a = "some random test message"
    val words = a.split(" ")
    val keys = Set("hi","random","test") // could be a List (see below)
    words.exists(keys contains _)
    

    请记住,list 键仅对小列表有效。对于列表,contains 方法通常会线性扫描整个列表,直到找到匹配项或到达末尾。

    对于大量项目,集合不仅更可取,而且更真实地表示信息。集合通常通过哈希码等进行优化,因此需要较少的线性搜索 - 或者根本不需要。

    【讨论】:

    • 感谢您的回复! “存在”只会返回真或假!我怎样才能真正得到匹配的字符串?
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 2018-11-28
    • 2022-01-09
    • 2017-05-03
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多