Scala 为列表中的字符串生成Int映射
使用此代码,我试图输出一个Int值,该值对应于列表中的字符串值:Scala 为列表中的字符串生成Int映射,scala,Scala,使用此代码,我试图输出一个Int值,该值对应于列表中的字符串值: val l = List("a" , "b" , "b" , "a"); var counter = 0; var isAdded = new scala.collection.mutable.ListBuffer[String](); val map = scala.collection.mutable.HashMap.empty[String,Int] def getId
val l = List("a" , "b" , "b" , "a");
var counter = 0;
var isAdded = new scala.collection.mutable.ListBuffer[String]();
val map = scala.collection.mutable.HashMap.empty[String,Int]
def getId(m : String) : Int = {
if(map.isDefinedAt(m)){
map.get(m).get
}
else {
map += m -> counter
counter = counter + 1
counter
}
}
(l.map(m => getId(m))).foreach(println)
1
2
1
0
当我期望1,2,2,1
时输出,每个Int在映射到列表中元素的方式上是连续的和唯一的。如果列表包含(“a”、“b”、“b”、“a”、“r”),则应生成1,2,2,1,3
。
我知道这是一个强制性的解决方案尝试,但我正在尝试在转换为功能性解决方案之前使用强制性的解决方案
如何生成映射到列表中的值的顺序Int值的唯一列表
scala> val chars = List("a" , "b" , "b" , "a" , "r")
chars: List[String] = List(a, b, b, a, r)
用不同的字符制作一个映射[String,Int]
,用于查找字符中每个字符的数值
scala> val map = chars.distinct.zipWithIndex.toMap
map: scala.collection.immutable.Map[String,Int] = Map(a -> 0, b -> 1, r -> 2)
现在,浏览列表并获取每个字符的数值
scala> chars.flatMap(c => map.get(c) + 1)
res1: List[Int] = List(1, 2, 2, 1, 3)
我认为命令式方法更难推理。您的计数器在错误的位置递增。这就解决了这个问题:
def getId(m : String) : Int = {
if(map.isDefinedAt(m)){
map.get(m).get
}
else {
counter = counter + 1 // should be incremented before adding to map
map += m -> counter
counter
}
}
谢谢,但我收到错误:,类型不匹配;[error]found:Int(1)[error]required:String[error]val output=l.flatMap(c=>map.get(c)+1),我改为使用:chars.map(c=>map.get(c.get+1)