[英]Generate Int mapping for String in List
使用此代碼我試圖輸出與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值的唯一List?
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)
我認為一種必要的方法更難以推理。
您的計數器在錯誤的位置遞增。 這解決了它:
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.