How to sort an array of structs by multiple columns in Swift

1 Answer

0 votes
import Foundation

struct Item: CustomStringConvertible {
    let a: Int
    let b: Int
    let label: String

    var description: String {
        "(\(a), \(b), \(label))"
    }
}

// Sort by a, then b
func sortData(_ items: [Item]) -> [Item] {
    items.sorted {
        if $0.a != $1.a {
            return $0.a < $1.a
        }
        return $0.b < $1.b
    }
}

// Print all items
func printData(_ items: [Item]) {
    for item in items {
        print(item)
    }
}

// Find first item by label
func findByLabel(_ items: [Item], label: String) -> Item? {
    items.first { $0.label == label }
}

// Filter by a
func filterByA(_ items: [Item], value: Int) -> [Item] {
    items.filter { $0.a == value }
}

// -----------------------------
// main
// -----------------------------

let data: [Item] = [
    Item(a: 7, b: 2, label: "python"),
    Item(a: 8, b: 3, label: "c"),
    Item(a: 3, b: 5, label: "c++"),
    Item(a: 4, b: 1, label: "c#"),
    Item(a: 3, b: 2, label: "java"),
    Item(a: 7, b: 1, label: "go"),
    Item(a: 1, b: 2, label: "rust")
]

let sorted = sortData(data)
print("Sorted data:")
printData(sorted)

print("\nSearching for 'java':")
if let found = findByLabel(sorted, label: "java") {
    print(found)
}

print("\nFiltering items where a == 7:")
let filtered = filterByA(sorted, value: 7)
printData(filtered)




/*
run:

Sorted data:
(1, 2, rust)
(3, 2, java)
(3, 5, c++)
(4, 1, c#)
(7, 1, go)
(7, 2, python)
(8, 3, c)

Searching for 'java':
(3, 2, java)

Filtering items where a == 7:
(7, 1, go)
(7, 2, python)


*/

 



answered Jan 29 by avibootz
...