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
Post a Comment