겹치는 요소가있는 튜플 목록의 목록이 있습니다.스칼라의 튜플 목록 병합 목록
val tupLis:Seq[(List[(Integer,Char)],Int)] = null//data
튜플 목록에서 겹치는 요소를 병합하려고합니다. 여기에 어떤 코드를 사용하여 어떤 foldleft를 사용하여 목록에서 중복 된 튜플 목록을 병합합니다. 병합 작업이 수행되지 않습니다. 일부 튜플 목록 요소가 누락되어 있습니다. 각 튜플 목록에는 4 개의 튜플이 들어 있습니다. . 목록의 각 튜플 목록은 슬라이딩 기능을 사용하여 더 큰 목록에서 생성 될 때 종종 겹쳐집니다.
(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 :
오버랩 :이 개 목록의 경우 여기를
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
}
내가 사용하고있는 예제 데이터입니다 튜플은 3 개 이상의 정확한 튜플을 두리스트에 모두 가지고 있습니다. 튜플의 중복 목록으로 간주됩니다. 두리스트가 병합 될 때 uld는 아무런 차이가 없어야합니다. 두리스트의 튜플 값 중 하나가 같은 정수이지만 다른 char을 갖는다면, 병합되지 않습니다. 병합 : 두 개 이상의 튜플 목록이 겹칠 때이를 조합합니다.
업데이트 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)) 여기
그래서 지금 내가해야 할 일을했을 모두가 interGrps
을 사용했다
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))
을 사용 자신의 인덱스 튜플의 목록은 링크입니다 두 번째 값에 따라 그룹을 만들고 마지막으로 인덱스를 튜플 목록으로 바꿉니다.
병합 된 목록 (그리고 당신이 "중복"을 의미하는)의 정의는 매우 불분명하다 특히 총액을주지 않는 한. –
죄송합니다, 아직 명확하지 않습니다. 동일한 정수 값을 갖는 char에 차이가있을 때 "겹치기"합니까? 거기에 "병합"을 사용하기 때문에 약간 혼란 스럽습니다. "3 개 이상의 튜플을 공유하면 두 개의 목록이 겹치고 같은 번호를 가진 튜플 쌍에는 다른 문자가 없습니까?" –
예, "3 개 이상의 튜플을 공유하면 두리스트가 겹칩니다. 숫자가 같은 튜플 쌍에는 다른 문자가 없습니다" – Balaram26