【发布时间】:2016-10-08 04:09:44
【问题描述】:
我有一个包含重叠元素的元组列表。
val tupLis:Seq[(List[(Integer,Char)],Int)] = null//data
我正在尝试合并元组列表中的重叠元素。这是我正在处理的代码,它使用 foldleft 来合并列表中的重叠元组列表。合并无法正常工作,因为它错过了元组列表的一些元素。每个元组列表中包含 4 个元组.列表中的每个元组列表经常重叠,因为它们是使用滑动函数从更大的列表生成的。
val alLis:Seq[(List[(Integer,Char)],Int)] = snGrMap.map(_._2).flatten.toList.sortBy(_._1.head._1)
val res = alLis.foldLeft(mutable.HashMap.empty[Int,(List[Integer],List[(Integer,Char)],Int)]) { (map, value) =>
if(map.size<=0){
map.put(0,(value._1.map(_._1),value._1,value._2))
}else{
val cads = map.filter(p=>value._1.intersect(p._2._2).size>=3)
if(cads.size>=1) {
cads.foreach { i =>
val cmnPos = i._2._1.intersect(value._1.map(_._1))
val cmnBase = i._2._2.filter(p=>cmnPos.contains(p._1)).intersect(value._1.filter(p=>cmnPos.contains(p._1)))
println(cmnBase.size,cmnPos.size,value._1, i._2._2)
if(cmnBase.size == cmnPos.size)
map.put(i._1,((i._2._1++value._1.map(_._1)).distinct,(i._2._2++value._1).distinct,i._2._3+value._2))
else
map.put(map.size,(value._1.map(_._1),value._1,value._2))
}
}else{
map.put(map.size,(value._1.map(_._1),value._1,value._2))
}
}
map
}
这是我正在使用的示例数据:
(List((306,c), (328,g), (336,a), (346,g)),282)
(List((306,g), (328,c), (336,g), (346,a)),22)
(List((306,c), (328,c), (336,g), (346,a)),4)
(List((328,g), (336,a), (346,g), (348,t)),164)
(List((328,g), (336,a), (346,g), (348,c)),161)
(List((328,c), (336,g), (346,a), (348,c)),28)
(List((336,a), (346,g), (348,t), (358,a)),168)
(List((336,a), (346,g), (348,c), (358,a)),154)
(List((336,g), (346,a), (348,c), (358,g)),30)
(List((346,g), (348,t), (358,a), (361,c)),178)
(List((346,g), (348,c), (358,a), (361,c)),166)
(List((346,a), (348,c), (358,g), (361,g)),34)
合并后的列表如下:
List((306,c), (328,g), (336,a), (346,g), (348,t), (358,a), (361,c),792)
List((306,c), (328,g), (336,a), (346,g), (348,c), (358,a), (361,c) ),763)
List((306,g), (328,c), (336,g), (346,a), (348,c), (358,g), (361,g) ),96)
更新 1:
重叠:如果两个元组列表在两个列表中都存在3个或更多精确元组,那么它们应该是重叠的元组列表。但是当两个列表合并时应该没有任何区别。如果其中一个两个列表中的元组值具有相同的整数但不同的字符,则它们不应合并。 合并:当它们重叠时合并两个或多个元组列表。
更新 2:我想出了一个小解决方案,但不确定它的效率如何。
val alLisWithIndex = alLis.zipWithIndex
val interGrps = new ListBuffer[(Int,Int)]()
alLisWithIndex.foreach{i=>
val cads = alLisWithIndex.filter(p=>p._1._1.take(3).intersect(i._1._1.takeRight(3)).size>=3)
cads.foreach(p=>interGrps.append((i._2,p._2)))
}
println(interGrps.sortBy(_._1))
所以当我打印上面的代码时,我得到了以这种方式分组的元组列表。我只打印了应该合并的每个元组组的索引。
生成的结果:ListBuffer((0,2), (0,3), (1,4), (2,5), (3,6), (4,7), (5,8), (6,9), (7,10))
这里是元组列表及其使用的索引
List(((List((306,c), (328,g), (336,a), (346,g)),282),0),
((List((306,g), (328,c), (336,g), (346,a)),22),1),
((List((328,g), (336,a), (346,g), (348,t)),164),2),
((List((328,g), (336,a), (346,g), (348,c)),161),3),
((List((328,c), (336,g), (346,a), (348,c)),28),4),
((List((336,a), (346,g), (348,t), (358,a)),168),5),
((List((336,a), (346,g), (348,c), (358,a)),154),6),
((List((336,g), (346,a), (348,c), (358,g)),30),7),
((List((346,g), (348,t), (358,a), (361,c)),178),8),
((List((346,g), (348,c), (358,a), (361,c)),166),9),
((List((346,a), (348,c), (358,g), (361,g)),34),10))
所以现在我要做的就是使用interGrps,根据第二个值链接组,最后用元组列表替换索引..
【问题讨论】:
-
合并列表的定义(以及“重叠”的含义)非常不清楚,尤其是在您没有给出总数的情况下。
-
抱歉,还不清楚。当具有相同整数值的 char 存在差异时,它们是否“重叠”?这有点令人困惑,因为您在那里使用“合并”。说“如果两个列表共享 3 个或更多元组,并且任何一对具有相同编号的元组没有不同的字符,那么它们是否重叠?”
-
是的,如果两个列表共享3个或更多元组,则两个列表重叠,并且任何一对相同编号的元组没有不同的字符"
-
但这会产生更多的输出元素,而不是更少,因为现在重叠的东西更少了。查看我更新的问题 - 仍然无法给出正确答案
-
我已经用我最终得到的答案更新了问题。
标签: list scala merge overlapping foldleft