scala - Zip non sequential list based on condition -


i have scenario zip 2 lists in scala based on condition. might not in sequence. best way that?

i want group directretailcm , directretailcm same requestid tuple.

object main extends app {    case class salesdoc(val id: int, val name: string, val requestid: string) {}    val list = list(      salesdoc(1, "illegal", "1"),      salesdoc(2, "directretailcm", "1"),       salesdoc(3, "directretailoffsetinvoice", "2"),      salesdoc(4, "directretailcm", "2"),      salesdoc(5, "other", "2"),       salesdoc(5, "directretailcm", "leftout"),      salesdoc(6, "illegal2", "4"),       salesdoc(5, "other", "3"),      salesdoc(7, "directretailoffsetinvoice", "4"),      salesdoc(8, "directretailcm", "4")   )   // expect zip results of droffsetinvoice , drcms list(   (salesdoc(3, "directretailoffsetinvoice", "2"), salesdoc(4, "directretailcm", "2")),   (salesdoc(7, "directretailoffsetinvoice", "4"), salesdoc(8, "directretailcm", "4"))   ) } 

the initial approach can think of was

  • group directretailcm - list.filter(e => e.name == "directretailcm")
  • group directretailoffsetinvoice - list.filter(e => e.name == "directretailoffsetinvoice")
  • zip both - might not in sequence
  • there rows don't have counterparts

can please suggest other approach need consider?

// don't need val keyword case class case class salesdoc(id: int, name: string, requestid: string)  val list = list(   salesdoc(1, "illegal", "1"),   salesdoc(2, "directretailcm", "1"),    salesdoc(3, "directretailoffsetinvoice", "2"),   salesdoc(4, "directretailcm", "2"),   salesdoc(5, "other", "2"),    salesdoc(5, "directretailcm", "leftout"),   salesdoc(6, "illegal2", "4"),    salesdoc(5, "other", "3"),   salesdoc(7, "directretailoffsetinvoice", "4"),   salesdoc(8, "directretailcm", "4") )  // find of directretailoffsetinvoice items val offsets = list.filter(_.name == "directretailoffsetinvoice")  // map on of directretailoffsetinvoice items , see if there matching directretailcm item val maybematched = offsets.map(offset => {   val maybecm = list.find(i => i.requestid == offset.requestid && i.name == "directretailcm")    // return tuple of type (salesdoc, option[salesdoc])   (offset, maybecm) })  // map on tuples , take ones there match, , extract option create tuple of (salesdoc, salesdoc) val output = maybematched.collect { case (s1, some(s2)) => (s1, s2) }  output.foreach(println) // (salesdoc(3,directretailoffsetinvoice,2),salesdoc(4,directretailcm,2)) // (salesdoc(7,directretailoffsetinvoice,4),salesdoc(8,directretailcm,4)) 

Comments

Popular posts from this blog

PHP and MySQL WP -

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

go - golang pprof for c library code -