簡體   English   中英

為List中的String生成Int映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM