Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用scala从元组列表中找出公共元组?_Scala - Fatal编程技术网

如何使用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。在这种情况下,我如何实现您的解决方案?