为List中的String生成Int映射

时间:2016-10-20 23:04:28

标签: scala

使用此代码我正在尝试输出与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值的唯一列表?

2 个答案:

答案 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
        }
    }