Scala:构造将 int 值分配给字符的“Map”的简洁语法?

Scala: concise syntax for constructing `Map` that assigns int-values to characters?

我想定义一个 Map 来为字母赋值,如下所示:

等等

这是我尝试过的:

   def lettersAndValues = Map(
     1 -> Set('A', 'B', 'C'),
     2 -> Set('D', 'E', 'F'),
   ).flatMap {case (value, letters) => letters.map(letter =>(letter, value))}

现在我想使用字母的值来计算单词的分数,例如计算 "ABCD" 的值应该得到 1+1+1+2 = 5。如何定义得分函数?有没有其他更简洁的方法给字母赋值进行计算?

如果您的目标是快速定义许多字母的值,然后定义一个得分函数,这里有一个更简短的方法:

val letterToValue = List(
  "ABC" -> 1,
  "DEF" -> 2
).flatMap{
  case (letters, value) => letters.map(letter => (letter, value))
}.toMap

def score(word: String) = word.map(letterToValue).sum

println(score("BED"))
println(score("BAD"))
println(score("CAFEBABE"))

它打印:

5
4
11

一种理解方法:

val generatorMap = Map(
  "ABC" -> 1,
  "DEF" -> 2
)
val letterToValue: Map[Char, Int] = for {
  (ls, v) <- generatorMap
  l <- ls
} yield {
  (l, v)
}

def score(word: String) = word.map(letterToValue).sum