我想在類似於特定文本的地圖中找到一個鍵。我應該使用for循環還是有更優雅的方式?我如何在基於scala模式匹配的地圖中找到一個鍵
2
A
回答
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
這實際上取決於你的意思是「相似」和「文字」。如果您使用的是英文單詞,則可以使用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使用。
相關問題
- 1. 如何使用模式匹配Scala中
- 2. 如何在命令行中匹配另一個模式的目錄中找到匹配模式的文件?
- 3. 如何匹配scala的值地圖
- 4. 基於匹配模式的單獨的scala列表
- 5. 無法找到與端點模式net.tcp匹配的基地址
- 6. 匹配兩個基於模式
- 7. Scala的模式匹配
- 8. 我應該如何匹配Scala中的模式?
- 9. 如何在Java中找到多個模式(使用匹配器)
- 10. paramiko如何通過流尋找直到一個模式匹配
- 11. 我如何在Scala範圍內進行模式匹配?
- 12. Scala:異常模式匹配
- 13. 尋找在Scala中進行模式匹配時如何使用「@ _ *」的示例
- 14. 爲什麼我的模式匹配在Scala中失敗?
- 15. 爲什麼我的模式匹配集合在Scala中失敗?
- 16. Scala類型不匹配問題(預期地圖,找到scala.collection.mutable.HashMap)
- 17. 關於兩個綁定變量類型的Scala模式匹配
- 18. 如何在Scala中匹配多個值?
- 19. 如何模式匹配一個函數?
- 20. Python:我如何找到匹配給定的多個模式中的任何一個的所有字符串
- 21. REGEX模式 - 我如何匹配在html中的某個標籤
- 22. 如何模式匹配Scala中的嵌套類?
- 23. 意外Scala的模式匹配語法
- 24. Scala的模式匹配上(試,試)
- 25. 自動拆箱Scala的模式匹配
- 26. 與集合匹配的Scala模式
- 27. 與清單匹配的Scala模式
- 28. 模式匹配的Scala迭代器
- 29. 在scala中對一系列值進行模式匹配
- 30. 如何找到一個正則表達式的匹配
我不認爲我的作品:斯卡拉> VAL RMatch = 「t」 的.R RMatch:scala.util.matching.Regex = T 斯卡拉> VAL MyMap中=地圖( 「二」 - >「我「,」三「 - >」二「);我的地圖:我的地圖collectFirst {case(RMatch(___) ),v)=> v} res12:Option [java.lang.String] =無 scala> – oshai
這是因爲您的密鑰都不是「t」!嘗試'「t。*」。r' –