Как я могу найти ключ на карте на основе сопоставления с шаблоном в Scala - PullRequest
3 голосов
/ 25 сентября 2011

Я хочу найти ключ на карте, который похож на определенный текст. я должен использовать для цикла или есть более элегантный способ?

Ответы [ 4 ]

9 голосов
/ 25 сентября 2011

Прямой перевод вашего вопроса: 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

Цикл может быть непродуктивным, если вы не хотите сканировать все ключи.

8 голосов
/ 25 сентября 2011

Предположим, у вас есть какое-то регулярное выражение, которому вы хотите соответствовать:

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 }

Примечание : реализация этого метода приводит к обходу карты, если это не то, что вы хотели

0 голосов
/ 25 сентября 2011

Это действительно зависит от того, что вы подразумеваете под «похожим» и «текстом». Если вы используете английские слова, вы можете использовать алгоритм 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.

0 голосов
/ 25 сентября 2011

Это зависит от шаблона и базовой реализации карты.Если карта HashMap, то она может дать вам только точное совпадение с ключом, поэтому вы не можете сделать ничего лучше, чем зациклить его ключи.Если карта SortedMap и вы знаете начало искомого текста, то вы можете использовать метод range, чтобы получить часть карты на основе шаблона и выполнить цикл по этому диапазону.

...