2016-10-20 46 views
1

诠释映射字符串使用此代码我试图输出对应于字符串值列表中一个Int值:当我期待1,2,2,1生成在列表

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 

被输出,每个INT是顺序以及它如何映射到List中的元素。如果List包含(“a”,“b”,“b”,“a”,“r”),则应生成1,2,2,1,3。 我知道这是一个必要的解决方案尝试,但我试图在转换到功能之前尝试一个命令性的解决方案。

如何生成映射到列表中值的顺序Int值的唯一列表?

回答

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) 

我认为当务之急的方法是比较难推理。

+0

谢谢,但我收到错误:,类型不匹配; [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) –

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