如何使用图像的升序日期时间来排序 .jpg 文件是在 Scala 中捕获的

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

图像保存格式为照片 name.extension、城市名称、yyyy-mm-dd hh:mm:ss

我正在尝试在 scala 中编写 函数,它给出了期望的结果。

例如:

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

预期输出:

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

有 3 张来自美国的照片,分别是 usa01、usa02 和 usa03。 同样china01,china02和china03

感谢您的建议或方法。 谢谢

我将其分解为多个步骤以使其更清楚:

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)

或者为了好玩而写一行:

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

输出:

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