如果我有一个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一样全部使用它
答案 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) }
...取决于您希望最终输出的输出类型。