如何使用图像的升序日期时间来排序 .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)
图像保存格式为照片 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)