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

1 Answer

0 votes
import Foundation

// ------------------------------------------------------------
// Date struct for proper date handling
// ------------------------------------------------------------
struct DateStruct {
    let year: Int
    let month: Int
    let day: Int
}

// ------------------------------------------------------------
// Print a date in YYYY-MM-DD format
// ------------------------------------------------------------
func formatDate(_ d: DateStruct) -> String {
    String(format: "%04d-%02d-%02d", d.year, d.month, d.day)
}

// ------------------------------------------------------------
// File entry struct
// ------------------------------------------------------------
struct FileEntry {
    let name: String      // File name without extension
    let extensionName: String // Extension including dot
    let date: DateStruct  // Real date struct
    let size: Int         // Bytes
}

// ------------------------------------------------------------
// Sort by name (lexicographically)
// ------------------------------------------------------------
func sortByName(_ files: [FileEntry]) -> [FileEntry] {
    files.sorted { $0.name < $1.name }
}

// ------------------------------------------------------------
// Sort by extension (lexicographically)
// ------------------------------------------------------------
func sortByExtension(_ files: [FileEntry]) -> [FileEntry] {
    files.sorted { $0.extensionName < $1.extensionName }
}

// ------------------------------------------------------------
// Sort by date (year → month → day)
// ------------------------------------------------------------
func sortByDate(_ files: [FileEntry]) -> [FileEntry] {
    files.sorted {
        ($0.date.year, $0.date.month, $0.date.day) <
        ($1.date.year, $1.date.month, $1.date.day)
    }
}

// ------------------------------------------------------------
// Sort by size (ascending)
// ------------------------------------------------------------
func sortBySize(_ files: [FileEntry]) -> [FileEntry] {
    files.sorted { $0.size < $1.size }
}

// ------------------------------------------------------------
// Print file list
// ------------------------------------------------------------
func printFiles(_ files: [FileEntry]) {
    for f in files {
        print("\(f.name)\(f.extensionName)  \(formatDate(f.date))  \(f.size) bytes")
    }
    print()
}

// ------------------------------------------------------------
// Main program
// ------------------------------------------------------------
let files: [FileEntry] = [
    FileEntry(name: "G1zTo5jJk", extensionName: ".jpg", date: DateStruct(year: 2007, month: 7, day: 8), size: 51954),
    FileEntry(name: "LTEE4SI0j", extensionName: ".jpg", date: DateStruct(year: 2011, month: 11, day: 13), size: 43442),
    FileEntry(name: "PDqmuO3GH", extensionName: ".cpp", date: DateStruct(year: 2004, month: 5, day: 21), size: 3346),
    FileEntry(name: "qJO2qjukZ", extensionName: ".png", date: DateStruct(year: 2010, month: 8, day: 27), size: 67087),
    FileEntry(name: "HqclTqxb4", extensionName: ".cpp", date: DateStruct(year: 2020, month: 9, day: 5), size: 70531),
    FileEntry(name: "imVyTyoaF", extensionName: ".jpg", date: DateStruct(year: 2011, month: 3, day: 19), size: 43846),
    FileEntry(name: "rXwXdy8XO", extensionName: ".txt", date: DateStruct(year: 2017, month: 10, day: 12), size: 70193),
    FileEntry(name: "9Z4fbOBUc", extensionName: ".pdf", date: DateStruct(year: 2004, month: 6, day: 9), size: 1754),
    FileEntry(name: "ZHahuu4vS", extensionName: ".txt", date: DateStruct(year: 2003, month: 10, day: 10), size: 65126),
    FileEntry(name: "0SnZHh2GT", extensionName: ".png", date: DateStruct(year: 2006, month: 10, day: 18), size: 25890)
]

print("Original:")
printFiles(files)

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

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

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

print("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

...