How to convert a Seq[A] to a Map[Int, A] using a value of A as the key in the map?

前端 未结 4 1313
野趣味
野趣味 2021-01-31 07:59

I have a Seq containing objects of a class that looks like this:

class A (val key: Int, ...)

Now I want to convert this Seq<

相关标签:
4条回答
  • 2021-01-31 08:23

    One more 2.8 variation, for good measure, also efficient:

    scala> case class A(key: Int, x: Int)
    defined class A
    
    scala> val l = List(A(1, 2), A(1, 3), A(2, 1))
    l: List[A] = List(A(1,2), A(1,3), A(2,1))
    
    scala> val m: Map[Int, A] = (l, l).zipped.map(_.key -> _)(collection.breakOut)
    m: Map[Int,A] = Map((1,A(1,3)), (2,A(2,1)))
    

    Note that if you have duplicate keys, you'll discard some of them during Map creation! You could use groupBy to create a map where each value is a sequence:

    scala> l.groupBy(_.key)
    res1: scala.collection.Map[Int,List[A]] = Map((1,List(A(1,2), A(1,3))), (2,List(A(2,1))))
    
    0 讨论(0)
  • 2021-01-31 08:31

    Since 2.8 Scala has had .toMap, so:

    val map = seq.map(a => a.key -> a).toMap
    

    or if you're gung ho about avoiding constructing an intermediate sequence of tuples:

    val map: Map[Int, A] = seq.map(a => a.key -> a)(collection.breakOut)
    
    0 讨论(0)
  • 2021-01-31 08:41

    As scala knows to convert a Tuple of two to a map, you would first want to convert your seq to a tuple and then to map so (doesn't matter if it's int, in our case string, string):

    The general algorithm is this:

    1. For each item in Seq
    2. Item --> Tuple(key, value)
    3. For each tuple(key, value)
    4. Aggregate to Map(key,value)

    Or to sum up:

    Step 1: Seq --> Tuple of two

    Step 2: Tuple of two --> Map

    Example:

    case class MyData(key: String, value: String) // One item in seq to be converted to a map entry.
    
    // Our sequence, simply a seq of MyData
    val myDataSeq = Seq(MyData("key1", "value1"), MyData("key2", "value2"), MyData("key3", "value3")) // List((key1,value1), (key2,value2), (key3,value3))
    
    // Step 1: Convert seq to tuple
    val myDataSeqAsTuple = myDataSeq.map(myData => (myData.key, myData.value)) // List((key1,value1), (key2,value2), (key3,value3))
    
    // Step 2: Convert tuple of two to map.
    val myDataFromTupleToMap = myDataSeqAsTuple.toMap // Map(key1 -> value1, key2 -> value2, key3 -> value3)
    
    0 讨论(0)
  • 2021-01-31 08:49

    Map over your Seq and produce a sequence of tuples. Then use those tuples to create a Map. Works in all versions of Scala.

    val map = Map(seq map { a => a.key -> a }: _*)
    
    0 讨论(0)
提交回复
热议问题