使用此代码我正在尝试输出与List中的字符串值对应的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都是顺序的,并且它在映射到List中的元素时是唯一的。如果包含List(“a”,“b”,“b”,“a”,“r”),则应生成1,2,2,1,3
。
我理解这是一个必要的解决方案尝试,但我试图尝试一个必要的解决方案,然后转换为功能。
如何生成映射到List中的值的连续Int值的唯一列表?
答案 0 :(得分:2)
scala> val chars = List("a" , "b" , "b" , "a" , "r")
chars: List[String] = List(a, b, b, a, r)
从用于查找Map[String, Int]
中每个字符的数值的不同字符中设置chars
。
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)
我认为一种必要的方法更难以推理。
答案 1 :(得分:1)
您的计数器在错误的位置递增。这解决了它:
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
}
}