【问题标题】:How to update every value of the keyset in a LinkedHashMap in Scala, having a LinkedHashMap[Int, ListBuffer[Int]]?如何更新Scala中LinkedHashMap中键集的每个值,具有LinkedHashMap [Int,ListBuffer [Int]]?
【发布时间】:2018-05-17 23:07:36
【问题描述】:

我有一个 LinkedHashMap 类型:

var map: LinkedHashMap[Int, ListBuffer[Int]] = ((1 -> (2, 1)), (2 -> 2), (3 -> (5, 3)))

我想为每个键的每个列表添加一个元素,假设我想添加“6”以便拥有:

((1 -> (6, 2, 1)), (2 -> (6, 2)), (3 -> (6, 5, 3)))

我该怎么做?

【问题讨论】:

    标签: scala list linkedhashmap listbuffer mutablemap


    【解决方案1】:

    像这样:

    val map: mutable.LinkedHashMap[Int, ListBuffer[Int]] =
      mutable.LinkedHashMap(1 -> ListBuffer(2, 1),
                            2 -> ListBuffer(2, 2),
                            3 -> ListBuffer(5, 3))
    
    val res = map.mapValues(lstBuffer => lstBuffer += 6)
    println(res)
    

    产量:

    Map(1 -> ListBuffer(2, 1, 6), 2 -> ListBuffer(2, 2, 6), 3 -> ListBuffer(5, 3, 6))
    

    请注意,mapValues 是惰性的,除非具体化,否则不会执行。如果我们想让这个严格并立即执行,我们可以使用map

    val res = map.map { case (_, lstBuffer) => lstBuffer += 6 }
    

    如果您想添加,请改用.prepend(它会返回 Unit 并对当前的Map 实例产生副作用):

    map.foreach { case (_, lstBuffer) => lstBuffer.prepend(6) }
    

    我想指出,通常,如果您想按顺序迭代整个 Map[K, V],这表明您使用了错误的数据结构。虽然没有更多信息,但我无法真正为该假设建立基础。

    【讨论】:

    • mapValues 不是很懒,每次打印值时都会执行副作用?
    • @OlegPyzhcov mapValues 是懒惰的,foreach 是实现结果的那个。添加了评论和替代的严格解决方案。感谢您的关注。
    • 我应该使用什么数据结构?我会将它应用于数百个元素的列表。我选择LinkedHashMap,因为它使用哈希表。另外,是不是可以在每个列表的头部添加元素?
    • @YuvalItzchakov mapValues 没有记忆,IIRC,所以如果你打印两次,你会得到两次执行的副作用。最好只使用foreach
    • @OlegPyzhcov 不是。如果需要立即执行整体执行,最好使用map
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2023-04-05
    • 2015-02-26
    • 2016-01-14
    相关资源
    最近更新 更多