如何使用scala从元组列表中找出公共元组?
我有两个清单如下-如何使用scala从元组列表中找出公共元组?,scala,Scala,我有两个清单如下- val list1 = List(("192.168.0.1","A"),("192.168.0.2","B"),("192.168.0.3","C")) val list2 = List(("192.168.0.104",2), ("192.168.0.119",2), ("205.251.0.185",24), ("192.168.0.1",153)) 我希望匹配两个列表的第一个值,如下所示: outputList = List(("192.168.0.1","A",1
val list1 = List(("192.168.0.1","A"),("192.168.0.2","B"),("192.168.0.3","C"))
val list2 = List(("192.168.0.104",2), ("192.168.0.119",2), ("205.251.0.185",24), ("192.168.0.1",153))
我希望匹配两个列表的第一个值,如下所示:
outputList = List(("192.168.0.1","A",153))
目前,我正在使用以下命令获取输出-
list1.map{
ajson =>
val findHost = list2.filter(_._1.contains(ajson._1.trim))
if(findHost.nonEmpty) {
(ajson._1,ajson._2,findHost.head._2)
} else ("NA","NA",0)
}.filterNot(p => p._1.equals("NA") || p._2.equals("NA"))
这是正确的方法吗?
我也试过了
(list1 ::: list2).groupBy(_._1).map{.......}
但它给出了列表1中的所有元素
有人能帮我获得预期的输出吗?下面的代码应该可以做到这一点
val result=list2.flatMap{
条目=>
map.get(entry.\u 1.trim)匹配{
案例部分(列表)=>
一些(list.map){
l=>
(1号、2号、入口)
})
案例无=>无
}
}.压扁
下面的代码应该可以做到这一点
val result=list2.flatMap{
条目=>
map.get(entry.\u 1.trim)匹配{
案例部分(列表)=>
一些(list.map){
l=>
(1号、2号、入口)
})
案例无=>无
}
}.压扁
您可以尝试以下方法:
val res = for(
(k,v) <- list1;
n <- list2.toMap.get(k)
) yield (k,v,n)
val res=for(
(k,v)你可以试试这个:
val res = for(
(k,v) <- list1;
n <- list2.toMap.get(k)
) yield (k,v,n)
val res=for(
(k,v)最有效的可能是
val m1 = list1.toMap
val m2 = list2.toMap
m1.keySet.intersect(m2.keySet).map(key => (key, m1(key), m2(key)))
更新
例如,如果列表中的图形比Tuple2
复杂
val list1 = List(("192.168.0.1", "A", true, 'C'), ("192.168.0.2", "B", false, 'D'), ("192.168.0.3", "C", true, 'E'))
val list2 = List(("192.168.0.104", 2, 5.7), ("192.168.0.119", 2, 13.4), ("205.251.0.185", 24, 11.2), ("192.168.0.1", 153, 34.8))
,您可能需要进行其他整形,如
val m1 = list1.view.map { case (key, v1, v2, v3) => (key, (v1, v2, v3)) }.toMap
val m2 = list2.view.map { case (key, v1, v2) => (key, (v1, v2)) }.toMap
m1.keySet.intersect(m2.keySet).map(key => (key, m1(key), m2(key)))
或者,您也可以使用增强型johny版本进行以下整形:
val m2 = list2.view.map { case (key, v1, v2) => (key, (v1, v2)) }.toMap
list1.collect { case (ip, x1, x2, x3) if m2 contains ip => (ip, (x1, x2, x3), m2(ip)) }
最有效的可能是
val m1 = list1.toMap
val m2 = list2.toMap
m1.keySet.intersect(m2.keySet).map(key => (key, m1(key), m2(key)))
更新
例如,如果列表中的图形比Tuple2
复杂
val list1 = List(("192.168.0.1", "A", true, 'C'), ("192.168.0.2", "B", false, 'D'), ("192.168.0.3", "C", true, 'E'))
val list2 = List(("192.168.0.104", 2, 5.7), ("192.168.0.119", 2, 13.4), ("205.251.0.185", 24, 11.2), ("192.168.0.1", 153, 34.8))
,您可能需要进行其他整形,如
val m1 = list1.view.map { case (key, v1, v2, v3) => (key, (v1, v2, v3)) }.toMap
val m2 = list2.view.map { case (key, v1, v2) => (key, (v1, v2)) }.toMap
m1.keySet.intersect(m2.keySet).map(key => (key, m1(key), m2(key)))
或者,您也可以使用增强型johny版本进行以下整形:
val m2 = list2.view.map { case (key, v1, v2) => (key, (v1, v2)) }.toMap
list1.collect { case (ip, x1, x2, x3) if m2 contains ip => (ip, (x1, x2, x3), m2(ip)) }
这并不特别重要,但此解决方案对(k,v)
上的每个迭代都运行list2.toMap
,这不是非常有效,也不清楚为什么第一个元素应该转换为toMap
,这并不特别重要,但此解决方案对(k,v)上的每个迭代都运行list2.toMap
这不是很有效,也不清楚为什么要将第一个元素转换为map
这基本上是Desugard Nyavro的解决方案我编辑我的评论添加“带密钥安全”,但得到了净错误。顺便说一句,这不是批评,只是一个注释这本质上是Desugard Nyavro的解决方案我编辑我的评论添加“关键是安全",但得到净错误。顺便说一句,这不是批评,只是一个显著的感谢你的回答。如果元组大小是2,这将是有益的。但在我的列表1中,元组大小可能是3或更多。列表2元组大小将始终是2。在这种情况下,我如何实现你的解决方案?感谢你的回答。这将是有益的,如果元组大小是2。但在我的列表1中,元组大小可能是2为3或更多。list2元组大小将始终为2。在这种情况下,我如何实现您的解决方案?