Как эффективно создать новый список из двух списков - PullRequest
0 голосов
/ 21 октября 2019

Предположим, у меня есть несколько списков, которые выглядят следующим образом. (Списки имеют разный размер)

Seq(
"xxx_code1_xxx",
"yyy_code2_yyy",
"zzz_code3_zzz",
"no-replacer",
...)


Seq(
CodeAndReplacer("_code1_", "-some-word-1-"), 
CodeAndReplacer("_code2_", "-some-word-2-"),
CodeAndReplacer("_code3_", "-some-word-3-"),
...)

Каков наилучший (scala) способ получить следующий вывод из этих списков?

Seq(
"xxx-some-word-1-xxx",
"yyy-some-word-2-yyy",
"zzz-some-word-3-zzz",
"no-replacer",
...)

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Вот подход, использующий find с проверкой contains, за которой следует replace:

case class CodeAndReplacer(code: String, word: String)

val l1 = Seq("xxx_code1_xxx", "yyy_code2_yyy", "zzz_code3_zzz", "no-replacer")
val l2 = Seq(CodeAndReplacer("_code1_", "-some-word-1-"), CodeAndReplacer("_code2_", "-some-word-2-"), CodeAndReplacer("_code3_", "-some-word-3-"))

l1.map( x =>
  l2.find(y => x.contains(y.code)) match {
    case Some(r) => x.replace(r.code, r.word)
    case None => x
  }
)
// res1: Seq[String] = List(xxx-some-word-1-xxx, yyy-some-word-2-yyy, zzz-some-word-3-zzz, no-replacer)
1 голос
/ 21 октября 2019

На ум приходит только грубая сила:

sources.map {
  case source => 
    replaces.foldLeft(source) {
      case (acc, CodeAndReplacer(sub, rep)) => acc.replaceAll(sub, rep)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...