Scala 为列表中的字符串生成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

使用此代码,我试图输出一个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(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)