重複する要素を持つタプル リストのリストがあります。
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:
重複: タプルの 2 つのリストに、両方のリストに 3 つ以上の正確なタプルが存在する場合、それらは重複するタプルのリストであると想定されます.しかし、2 つのリストがマージされた場合、違いはありません.両方のリストの整数は同じですが、文字が異なる場合、それらはマージされません。マージ: タプル リストの 2 つ以上のリストが重複している場合にそれらを結合すること。
更新 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、2番目の値に基づいてグループをリンクし、最後にインデックスをタプルのリストに置き換えることだけでした..