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

1 Answer

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

// ------------------------------------------------------------
// Print a date in YYYY-MM-DD format
// ------------------------------------------------------------
fun formatDate(d: DateStruct): String =
    "%04d-%02d-%02d".format(d.year, d.month, d.day)

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

// ------------------------------------------------------------
// Sort by name (lexicographically)
// ------------------------------------------------------------
fun sortByName(files: List<FileEntry>) =
    files.sortedBy { it.name }

// ------------------------------------------------------------
// Sort by extension (lexicographically)
// ------------------------------------------------------------
fun sortByExtension(files: List<FileEntry>) =
    files.sortedBy { it.extension }

// ------------------------------------------------------------
// Sort by date (year → month → day)
// ------------------------------------------------------------
fun sortByDate(files: List<FileEntry>) =
    files.sortedWith(
        compareBy<FileEntry> { it.date.year }
            .thenBy { it.date.month }
            .thenBy { it.date.day }
    )

// ------------------------------------------------------------
// Sort by size (ascending)
// ------------------------------------------------------------
fun sortBySize(files: List<FileEntry>) =
    files.sortedBy { it.size }

// ------------------------------------------------------------
// Print file list
// ------------------------------------------------------------
fun printFiles(files: List<FileEntry>) {
    for (f in files) {
        println("${f.name}${f.extension}  ${formatDate(f.date)}  ${f.size} bytes")
    }
    println()
}

// ------------------------------------------------------------
// Main program
// ------------------------------------------------------------
fun main() {
    val files = listOf(
        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 15 hours ago by avibootz

Related questions

...