Home > Software design >  how to order .jpg file with ascending order datetime of image was when it was captured in scala
how to order .jpg file with ascending order datetime of image was when it was captured in scala

Time:01-18

The image was saved with format photo name.extension, cityname, yyyy-mm-dd hh:mm:ss

i am trying to write function in scala which give desired result.

for eg:

john.jpg, USA,2013-09-15 14:08:15
BOB.jpg, UK,2013-09-15 14:08:15
RONY.jpg, USA,2013-09-15 19:08:15
A.PNG, USA,2018-09-15 21:08:15
TONY.jpg, CHINA,2020-09-15 19:08:15
MONY.PNG, CHINA,2021-09-15 21:08:15
RONY.jpg, CHINA,2015-09-15 19:08:15
A.PNG, JAPAN,2019-09-15 21:08:15

EXPECTED OUTPUT:

USA01.JPG
UK01.JPG
USA02.JPG
USA03.PNG
CHINA01.JPG
CHINA02.PNG
CHINA03.JPG
JAPAN01.PNG

There 3 pic from USA, so usa01, usa02 and usa03. similarly china01,china02 and china03

appreciate your suggestion or approach. Thanks

CodePudding user response:

I broke it down into steps to make it clearer:

scala> val images = List(
     |     "john.jpg, USA,2013-09-15 14:08:15",
     |     "BOB.jpg, UK,2013-09-15 14:08:15",
     |     "RONY.jpg, USA,2013-09-15 19:08:15",
     |     "A.PNG, USA,2018-09-15 21:08:15",
     |     "TONY.jpg, CHINA,2020-09-15 19:08:15",
     |     "MONY.PNG, CHINA,2021-09-15 21:08:15",
     |     "RONY.jpg, CHINA,2015-09-15 19:08:15",
     |     "A.PNG, JAPAN,2019-09-15 21:08:15"
     | )
val images: List[String] = List(john.jpg, USA,2013-09-15 14:08:15, BOB.jpg, UK,2013-09-15 14:08:15, RONY.jpg, USA,2013-09-15 19:08:15, A.PNG, USA,2018-09-15 21:08:15, TONY.jpg, CHINA,2020-09-15 19:08:15, MONY.PNG, CHINA,2021-09-15 21:08:15, RONY.jpg, CHINA,2015-09-15 19:08:15, A.PNG, JAPAN,2019-09-15 21:08:15)

scala> val props = images.map(_.split(",").map(_.trim)).filter(_.size == 3).map{case Array(x, y, z) => (x, y, z)}
val props: List[(String, String, String)] = List((john.jpg,USA,2013-09-15 14:08:15), (BOB.jpg,UK,2013-09-15 14:08:15), (RONY.jpg,USA,2013-09-15 19:08:15), (A.PNG,USA,2018-09-15 21:08:15), (TONY.jpg,CHINA,2020-09-15 19:08:15), (MONY.PNG,CHINA,2021-09-15 21:08:15), (RONY.jpg,CHINA,2015-09-15 19:08:15), (A.PNG,JAPAN,2019-09-15 21:08:15))

scala> val sortedProps = props.sortBy(_._3)
val sortedProps: List[(String, String, String)] = List((john.jpg,USA,2013-09-15 14:08:15), (BOB.jpg,UK,2013-09-15 14:08:15), (RONY.jpg,USA,2013-09-15 19:08:15), (RONY.jpg,CHINA,2015-09-15 19:08:15), (A.PNG,USA,2018-09-15 21:08:15), (A.PNG,JAPAN,2019-09-15 21:08:15), (TONY.jpg,CHINA,2020-09-15 19:08:15), (MONY.PNG,CHINA,2021-09-15 21:08:15))

scala> val relevantProps = sortedProps.map{ case (fname, cntry, date) => (fname.split("\\.")(1).toUpperCase, cntry) }
val relevantProps: List[(String, String)] = List((JPG,USA), (JPG,UK), (JPG,USA), (JPG,CHINA), (PNG,USA), (PNG,JAPAN), (JPG,CHINA), (PNG,CHINA))

scala> val (files, counts) = relevantProps.foldLeft((List[String](), Map[String, Int]())) { case ((res, counts), (ext, cntry)) => 
     |     val count = counts.getOrElse(cntry, 0)   1
     |     ((s"$cntry$count.$ext") :: res, counts.updated(cntry, count))
     | }
val files: List[String] = List(CHINA3.PNG, CHINA2.JPG, JAPAN1.PNG, USA3.PNG, CHINA1.JPG, USA2.JPG, UK1.JPG, USA1.JPG)
val counts: scala.collection.immutable.Map[String,Int] = Map(USA -> 3, UK -> 1, CHINA -> 3, JAPAN -> 1)

scala> val result = files.reverse
val result: List[String] = List(USA1.JPG, UK1.JPG, USA2.JPG, CHINA1.JPG, USA3.PNG, JAPAN1.PNG, CHINA2.JPG, CHINA3.PNG)

Or one-liner just for fun:

List(
    "john.jpg, USA,2013-09-15 14:08:15",
    "BOB.jpg, UK,2013-09-15 14:08:15",
    "RONY.jpg, USA,2013-09-15 19:08:15",
    "A.PNG, USA,2018-09-15 21:08:15",
    "TONY.jpg, CHINA,2020-09-15 19:08:15",
    "MONY.PNG, CHINA,2021-09-15 21:08:15",
    "RONY.jpg, CHINA,2015-09-15 19:08:15",
    "A.PNG, JAPAN,2019-09-15 21:08:15"
).map(_.split(",").map(_.trim))
.filter(_.size == 3).map{case Array(x, y, z) => (x, y, z)}
.sortBy(_._3)
.map{ case (fname, cntry, date) => (fname.split("\\.")(1).toUpperCase, cntry) }
.foldLeft((List[String](), Map[String, Int]())) { case ((res, counts), (ext, cntry)) => 
    val count = counts.getOrElse(cntry, 0)   1
    ((s"$cntry$count.$ext") :: res, counts.updated(cntry, count))
}._1.reverse

Output:

val res0: List[String] = List(USA1.JPG, UK1.JPG, USA2.JPG, CHINA1.JPG, USA3.PNG, JAPAN1.PNG, CHINA2.JPG, CHINA3.PNG)
  •  Tags:  
  • Related