Scala:构造将 int 值分配给字符的“Map”的简洁语法?
Scala: concise syntax for constructing `Map` that assigns int-values to characters?
我想定义一个 Map
来为字母赋值,如下所示:
'A'
、'B'
、'C'
应赋值1
'D'
、'E'
、'F'
应赋值2
等等
这是我尝试过的:
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
我想定义一个 Map
来为字母赋值,如下所示:
'A'
、'B'
、'C'
应赋值1
'D'
、'E'
、'F'
应赋值2
等等
这是我尝试过的:
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