【问题标题】:Transform scala inner map变换scala内部图
【发布时间】:2014-01-30 01:52:00
【问题描述】:

嘿,我有这样的地图:

val valueParameters = Map("key1"->"value","anotherkey1"->"value","thirdkey1"->"value","key2"->"value","anotherkey2"->"value","thirdkey2"->"value")

和模式:

val pattern = """(?<=[a-zA-Z])\d{1,2}""".r

val result =  valueParameters.groupBy(x=>pattern.findAllIn(x._1).next().toInt).toSeq.sortBy(_._1).toMap

它给出:Map[Int,Map[String,String],我想从第二个地图的第一个字符串中删除我不再需要的数字,所以我可以:result(1)("key") not result(1)("key1 ")

【问题讨论】:

  • 这似乎效率不高,但你可以做类似result.mapValues{case (key, value) =&gt; ('removenumberfromkeyhere', value)}
  • 小心使用 mapValues。这是一个惰性操作,所以这可能不是您想要的,因为每次访问都会进行计算。见issues.scala-lang.org/browse/SI-4776

标签: scala


【解决方案1】:

这应该可行

val result1 = result.map { case (k,v) => 
  k -> v.map { case (a,b) => 
    val a1 = a.takeWhile(! _.isDigit)
    a1 -> b
  } 
}

请注意,虽然使用 mapValues 会导致代码更短,但 mapValues 是一种惰性操作,它会在您每次访问地图时进行计算,而映射条目将导致计算只完成一次,这通常是您所期望的在scala中。

【讨论】:

  • 是的,谢谢,效果很好,是的,我不得不 a.replaceAll("\\d","") 因为会有两位数的条目。
  • 我修改了代码以删除数字。但是 replaceAll 显然也可以。
猜你喜欢
  • 2018-08-17
  • 2011-01-11
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多