как использовать list.collect или список соответствия, чтобы получить правильные данные - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть список строк, List ("098765432109: rule", "123456789012: *", "123456789012 &"),

Я хочу получить первые две строки в этом списке и отфильтровать третью one.

Когда я пытаюсь использовать list.collecnt, у меня есть Set (FeatureWhitelist (098765432109, All), FeatureWhitelist (123456789012, All)), кажется, что go не вошло во второе регулярное выражение,

когда я пытаюсь сопоставить список, я получаю "извлечение результата сопоставления из чего угодно, кроме последовательности символов или устаревшего совпадения", может кто-нибудь помочь мне с этим? Или используя другие методы

sealed trait RuleWhitelisting

object RuleWhitelisting {
  case class ByName(name: String) extends RuleWhitelisting
  case object All extends RuleWhitelisting
}

case class Whitelist(accountId: String, ruleWhitelisting: RuleWhitelisting)

lazy val pattrn = "([^:]*):([^:]*)".r
lazy val pattern1 = """(\d*):.*""".r

val res = list.collect {
      case pattern1(accnt) => Whitelist(accnt, All)

      case pattrn(accnt, rule) => Whitelist(accnt, ByName(rule))
    }.toSet

1 Ответ

1 голос
/ 07 апреля 2020

Полагаю, вы хотите получить:

"098765432109:rule" -> Whitelist("098765432109", ByName("rule")) //this doesnt work in your code
"123456789012:*" -> Whitelist("123456789012", All)

Если это так, вы ошиблись pattern1. Существует .*, который соответствует всем персонажам и выбрасывает их. pattern1 - первое правило в вашем вызове collect, и оно используется в обоих примерах. Это можно исправить двумя способами:

//use only one pattern and check if rule name is "*"
val res = list.collect {
      case pattrn(accnt, rule) => Whitelist(accnt, if (rule.trim=="*") All else  ByName(rule))
}.toSet


//or make pattern1 match asterisk symbol instead of anything
lazy val pattern1 = """(\d*):\*""".r
val res = list.collect {
      case pattern1(accnt) => Whitelist(accnt, All)
      case pattrn(accnt, rule) => Whitelist(accnt, ByName(rule))
}.toSet

Вот ваш код с исправлением: https://scalafiddle.io/sf/IoI7Whp/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...