如何根据scala中的模式匹配在地图中找到关键字

osh*_*hai 3 scala map pattern-matching

我想在地图中找到与特定文本类似的键.我应该使用for循环还是有更优雅的方式?

huy*_*hjl 9

您的问题的直接翻译是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
Run Code Online (Sandbox Code Playgroud)

如果您不想扫描所有键,循环可能会适得其反.


oxb*_*kes 8

假设您有一些您希望匹配的正则表达式:

val RMatch = """\d+:(\w*)""".r
Run Code Online (Sandbox Code Playgroud)

还有一个函数,它接受正则表达式的匹配组和映射中的值

def f(s: String, v: V): A
Run Code Online (Sandbox Code Playgroud)

然后你可以匹配正则表达式并收集函数的值:

map collectFirst { case (RMatch(_), v) => f(txt, v) }
Run Code Online (Sandbox Code Playgroud)

如果你只想要价值......

map collectFirst { case (RMatch(txt), v) => v }
Run Code Online (Sandbox Code Playgroud)

注意:此方法的实现会影响地图上的遍历,以防不是您想要的