Scala修改mapValues字符串集删除列

时间:2016-05-03 10:50:05

标签: scala dictionary

如果我有一个Map,可以将值从String映射到(String,String,String)

如何从列表中删除String将成为Map的第二个Map( String ->(String,String))

示例:

var mp = Map(
             "K1" -> List("K1_C1","K1_C2","K1_C3"),
             "K2" -> List("K2_C1","K2_C2","K2_C3"),
             "K2" -> List("K3_C1","K3_C2","K3_C3")
            )

我怎样才能达到这个目标:

Map(
    "K1" -> List("K1_C1","K1_C3"),
    "K2" -> List("K2_C1","K2_C3"),
    "K2" -> List("K3_C1","K3_C3")
   )

我尝试了这个但是没有工作

mp.mapValues( _.map(_.drop(2)))

此外,我还尝试将(String,String,String)转换为List,但它没有工作

mp.mapValues(_.map(_.toList.remove(2)))

这就像我第一次用scala编写,因为我必须这样做,并且像我写Java一样全部使用它

2 个答案:

答案 0 :(得分:2)

您与drop功能非常接近,但我建议您查看其文档。它从列表的开头删除给定数量的元素。

您真正想要的是take第一个和takeRight最后一个:

mp.mapValues(list => list.take(1) ++ list.takeRight(1))
然而,这非常难看。如果你确定你的值总是一个3元素列表,我建议模式匹配就像我用元组显示的那样:

mp.mapValues {
  case List(first, _, third) => List(first, third)
}

答案 1 :(得分:1)

看起来你的地图有元组列表,而不是字符串列表。这样的事情应该有效:

  m.mapValues { case List((a,b,c)) => (a,c) }

  m.mapValues { case List((a,b,c)) => List((a,c)) }

  m.mapValues { case List((a,b,c)) => List(a,c) }

...取决于您希望最终输出的输出类型。