2011-09-25 54 views

回答

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 

如果您不想掃描所有密鑰,循環可能會產生反效果。

0

它取決於模式和地圖的底層實現。如果地圖是HashMap,那麼它只能給你一個精確匹配的關鍵,所以你不能做任何事情比循環的關鍵。如果地圖是SortedMap,並且您知道要查找的文本的開頭,則可以使用range方法根據模式獲取地圖的一部分,並在該範圍內循環。

8

假設你有一定的正則表達式,你想匹配:在地圖上

def f(s: String, v: V): A 

val RMatch = """\d+:(\w*)""".r 

和一個函數,這需要匹配的組正則表達式,和值然後你可以匹配正則表達式並收集函數的值:

map collectFirst { case (RMatch(_), v) => f(txt, v) } 

如果你只想值...

map collectFirst { case (RMatch(txt), v) => v } 

注意這種方法的實施效果在地圖上遍歷,萬一這是不是你希望

+0

我不認爲我的作品:斯卡拉> VAL RMatch = 「t」 的.R RMatch:scala.util.matching.Regex = T 斯卡拉> VAL MyMap中=地圖( 「二」 - >「我「,」三「 - >」二「);我的地圖:我的地圖collectFirst {case(RMatch(___) ),v)=> v} res12:Option [java.lang.String] =無 scala> – oshai

+0

這是因爲您的密鑰都不是「t」!嘗試'「t。*」。r' –

0

這實際上取決於你的意思是「相似」和「文字」。如果您使用的是英文單詞,則可以使用Soundex算法(http://en.wikipedia.org/wiki/Soundex)爲每個單詞提供一個代碼並將其用作散列鍵,從而收集所有單詞Soundex一起列在一個列表中。如果你想做全文匹配,那麼它要複雜得多,你需要使用諸如Inverted Indexes(http://en.wikipedia.org/wiki/Inverted_index)這樣的技術。在這種情況下,你最好看一些預先編寫好的東西,比如Apache Lucene(http://lucene.apache.org/java/docs/),除了簡單的倒排索引之外,它還提供了更多的功能。 Lucene是用Java編寫的,所以它可以直接從Scala使用。