How to sort a list of files by name, extension, dates, and size in Scala

1 Answer

0 votes
// ------------------------------------------------------------
// Date struct for proper date handling
// ------------------------------------------------------------
case class DateStruct(year: Int, month: Int, day: Int)

// ------------------------------------------------------------
// Print a date in YYYY-MM-DD format
// ------------------------------------------------------------
def formatDate(d: DateStruct): String =
  f"${d.year}%04d-${d.month}%02d-${d.day}%02d"

// ------------------------------------------------------------
// File entry struct
// ------------------------------------------------------------
case class FileEntry(
  name: String,        // File name without extension
  extension: String,   // Extension including dot
  date: DateStruct,    // Real date struct
  size: Int            // Bytes
)

// ------------------------------------------------------------
// Sort by name (lexicographically)
// ------------------------------------------------------------
def sortByName(files: List[FileEntry]): List[FileEntry] =
  files.sortBy(_.name)

// ------------------------------------------------------------
// Sort by extension (lexicographically)
// ------------------------------------------------------------
def sortByExtension(files: List[FileEntry]): List[FileEntry] =
  files.sortBy(_.extension)

// ------------------------------------------------------------
// Sort by date (year → month → day)
// ------------------------------------------------------------
def sortByDate(files: List[FileEntry]): List[FileEntry] =
  files.sortBy(f => (f.date.year, f.date.month, f.date.day))

// ------------------------------------------------------------
// Sort by size (ascending)
// ------------------------------------------------------------
def sortBySize(files: List[FileEntry]): List[FileEntry] =
  files.sortBy(_.size)

// ------------------------------------------------------------
// Print file list
// ------------------------------------------------------------
def printFiles(files: List[FileEntry]): Unit = {
  files.foreach { f =>
    println(s"${f.name}${f.extension}  ${formatDate(f.date)}  ${f.size} bytes")
  }
  println()
}

// ------------------------------------------------------------
// Main program
// ------------------------------------------------------------
@main def run(): Unit = {
  val files = List(
    FileEntry("G1zTo5jJk", ".jpg", DateStruct(2007,7,8), 51954),
    FileEntry("LTEE4SI0j", ".jpg", DateStruct(2011,11,13), 43442),
    FileEntry("PDqmuO3GH", ".cpp", DateStruct(2004,5,21), 3346),
    FileEntry("qJO2qjukZ", ".png", DateStruct(2010,8,27), 67087),
    FileEntry("HqclTqxb4", ".cpp", DateStruct(2020,9,5), 70531),
    FileEntry("imVyTyoaF", ".jpg", DateStruct(2011,3,19), 43846),
    FileEntry("rXwXdy8XO", ".txt", DateStruct(2017,10,12), 70193),
    FileEntry("9Z4fbOBUc", ".pdf", DateStruct(2004,6,9), 1754),
    FileEntry("ZHahuu4vS", ".txt", DateStruct(2003,10,10), 65126),
    FileEntry("0SnZHh2GT", ".png", DateStruct(2006,10,18), 25890)
  )

  println("Original:")
  printFiles(files)

  println("Sorted by name:")
  printFiles(sortByName(files))

  println("Sorted by extension:")
  printFiles(sortByExtension(files))

  println("Sorted by date:")
  printFiles(sortByDate(files))

  println("Sorted by size:")
  printFiles(sortBySize(files))
}



/* Run:

Original:
G1zTo5jJk.jpg  2007-07-08  51954 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes

Sorted by name:
0SnZHh2GT.png  2006-10-18  25890 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes

Sorted by extension:
PDqmuO3GH.cpp  2004-05-21  3346 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes

Sorted by date:
ZHahuu4vS.txt  2003-10-10  65126 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes

Sorted by size:
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes

*/

 



answered 13 hours ago by avibootz

Related questions

...