我想在地图中找到与特定文字类似的关键字。我应该使用for循环还是有更优雅的方式?
答案 0 :(得分:8)
假设您有一些您希望匹配的正则表达式:
val RMatch = """\d+:(\w*)""".r
一个函数,它接受正则表达式的匹配组和映射中的值
def f(s: String, v: V): A
然后你可以匹配正则表达式并收集函数的值:
map collectFirst { case (RMatch(_), v) => f(txt, v) }
如果您只想要价值......
map collectFirst { case (RMatch(txt), v) => v }
注意:此方法的实现会影响地图上的遍历,以防不是您想要的
答案 1 :(得分:8)
您问题的直接翻译是map.keys.find(_.matches(pattern))
,它给出了一张地图,获取了密钥并找到了与正则表达式匹配的第一个密钥。
val map = Map("abc" -> 1, "aaa" -> 2, "cba" -> 3)
map.keys.find(_.matches("abc.*"))
// Some(abc)
map.keys.find(_.matches("zyx"))
// None
如果您不想扫描所有键,循环可能会适得其反。
答案 2 :(得分:0)
这取决于模式和地图的底层实现。如果地图是HashMap
,那么它只能给你一个与键完全匹配的内容,所以你不能做任何比循环其键更好的事情。如果地图是SortedMap
并且您知道要查找的文本的开头,那么您可以使用range
方法根据模式获取地图的一部分,并循环那范围。
答案 3 :(得分:0)
这实际上取决于“类似于”和“文字”的含义。如果您使用英语单词,您可以使用Soundex算法(http://en.wikipedia.org/wiki/Soundex)为每个单词提供代码并将其用作哈希键,收集所有单词Soundex值列在一个列表中。如果你想进行全文匹配,那么它会更加复杂,你需要使用反向索引(http://en.wikipedia.org/wiki/Inverted_index)等技术。在这种情况下,你最好看一些预先写好的东西,比如Apache Lucene(http://lucene.apache.org/java/docs/),除了简单的倒排索引之外,它还能为你提供更多。 Lucene是用Java编写的,因此可以直接从Scala中使用。