Escribo siguiendo Struct que se ajustan al protocolo Comparable.
struct Record: Comparable { static func < (lhs: Record, rhs: Record) -> Bool { if lhs.wins == rhs.wins { return lhs.losses > rhs.losses } return lhs.wins < rhs.wins } var wins: Int var losses: Int init(wins: Int, losses: Int) { self.wins = wins self.losses = losses } } var a1 = Record(wins: 3, losses: 8) var b1 = Record(wins: 3, losses: 9) var c1 = Record(wins: 4, losses: 7) var records = [a1, b1, c1] records.reverse() print(records)Todo funciona bien usando > < == y ordenar también. pero si invierto el método de clasificación en una matriz de registros, me da el siguiente resultado:
[__lldb_expr_48.Record(ganancias: 4, derrotas: 7), __lldb_expr_48.Record(ganancias: 3, derrotas: 9), __lldb_expr_48.Record(ganancias: 3, derrotas: 8)]
Las ganancias más altas deben ser lo primero, seguidas de menos ganancias, pero si las ganancias son iguales, menos pérdidas deben ocurrir antes de más pérdidas. ¿Estoy haciendo algo mal aquí o me estoy perdiendo algo? Todavía estoy aprendiendo rápido, así que podría ser posible.
Para ordenar una variedad de cosas en orden inverso, simplemente puede sort por > :
records.sort(by: >) reverse simplemente invertirá la matriz, sin ordenarla.
Simplemente no ordenas tu matriz antes de invertirla
records.sort() records.reverse()También hay una forma universal de ordenar como quieras sin ajustarse al protocolo Comparable. Puede ser útil si aplica varias lógicas de ordenación en diferentes lugares o simplemente ordena con poca frecuencia. Prueba este:
struct SimpleRecord { var wins: Int var losses: Int var name: String // we get a simple init for free } let a = SimpleRecord(wins: 3, losses: 8, name: "abc") let b = SimpleRecord(wins: 3, losses: 9, name: "some ") let c = SimpleRecord(wins: 4, losses: 7, name: "abc") let d = SimpleRecord(wins: 3, losses: 8, name: "Abc") var simpleRecords = [a, b, c, d] simpleRecords.sort(by: { (lhs, rhs) -> Bool in if lhs.wins > rhs.wins { return true } else if lhs.wins == rhs.wins { if lhs.losses < rhs.losses { return true } else if lhs.losses == rhs.losses { return (lhs.name.localizedStandardCompare(rhs.name) == ComparisonResult.orderedDescending) } else { return false } } else { return false } }) // print(simpleRecords) // it is a lazy collection so print is a bit messy simpleRecords.forEach{ print($0) }Tenga en cuenta cómo podemos usar algoritmos de clasificación predefinidos no triviales (pero eficientes) para cadenas (de Foundation) como 'localizedStandardCompare', 'localizedCompare', etc.