Arrays Swift中具有不同元素的数组中对象的排序列表问题

Arrays Swift中具有不同元素的数组中对象的排序列表问题,arrays,swift,sorting,Arrays,Swift,Sorting,我拥有保存用户及其记录的结构,如下所示: [ UserResults(username: "joluch99", results: [Record(wins: "12", total: "17", tie: "10", percent: "70.58")]), UserResults(username: "bsroberts44", results: [Re

我拥有保存用户及其记录的结构,如下所示:

[ 
    UserResults(username: "joluch99", results: [Record(wins: "12", total: "17", tie: "10", percent: "70.58")]), 
    UserResults(username: "bsroberts44", results: [Record(wins: "16", total: "17", tie: "20", percent: "94.11")]),
    UserResults(username: "fmiller", results: [Record(wins: "10", total: "17", tie: "5", percent: "58.83")]),
    UserResults(username: "iguerra", results: [Record(wins: "12", total: "17", tie: "30", percent: "70.58")]),
    ...
]
我想根据获胜最多的人来排序

我不完全确定我如何才能做到这一点?我见过排序的例子,当它只是一个简单的项目数组

我尝试了以下方法:

self.userResults = self.userResults.sorted(by: { $0.results[0].wins > $1.results[0].wins })
它不会对整个列表进行排序,似乎只有数组中的最后2个项得到了正确排序

有人能帮忙吗

更新:

我的最终目标是,上面看到的信息是如何从Firebase中提取的


我想在一个视图中显示列表,该列表由具有最高wins的用户排序。

此用于排序结构的代码将根据每个
UserResults
的结果数组中的第一个条目进行排序:

let sortedUsers = users.sorted {Int($0.results[0].wins) ?? 0 > Int($1.results[0].wins) ?? 0 }
如果您想查看每个用户的结果数组并选择最佳结果,那么它会稍微复杂一点,但只会稍微复杂一点


编辑: 在将结构转换为对数值使用Int和Double类型后,我还添加了代码以按关系排序:

// Define the Record type using Int and string values.
// Give ties a default value of 0 so we don't have to specify it.
struct Record {
    let wins: Int
    var ties: Int = 0
    let total: Int
    let percent: Double
}

struct UserResults {
    let username: String
    let results: [Record]
}

// Create some test data
let users = [
    UserResults(username: "joluch99", results: [
                    Record(wins: 3, total: 17, percent: 17.64),
                    Record(wins: 23, ties: 14, total: 17, percent: 17.64)]),
     UserResults(username: "bsroberts44",
                 results: [Record(wins: 16, total: 17, percent: 94.11)]),
     UserResults(username: "fmiller",
                 results: [Record(wins: 10, total: 17, percent: 58.83)]),
     UserResults(username: "iguerra", results: [
                    Record(wins: 12, total: 17, percent: 70.58),
        Record(wins: 23, ties: 12, total: 17, percent: 70.58),
     ]),
 ]


let sortedUsers = users.sorted {lhv, rhv in
    // Find the max record for the left hand item being compared
    let lhvMax = lhv.results.max(by: { ($0.wins, $0.ties) < ($1.wins, $1.ties) })!

    // Find the max record for the right hand item being compared.
    let rhvMax = rhv.results.max(by: { ($0.wins, $0.ties)  < ($1.wins, $1.ties) })!

    // Compare tuples containing the win count and ties count for the max record for the lefthand User and the righthand User being compared
    return (lhvMax.wins, lhvMax.ties) > (rhvMax.wins, rhvMax.ties)
}

sortedUsers.forEach { print ($0) }
//使用Int和string值定义记录类型。
//将默认值设置为0,这样我们就不必指定它。
结构记录{
让我们赢:Int
变量:Int=0
总数:Int
百分比:双倍
}
结构用户结果{
让用户名:String
让结果:[记录]
}
//创建一些测试数据
让用户=[
UserResults(用户名:“joluch99”,结果:[
记录(获胜3次,总数17次,百分比17.64),
记录(胜:23,平:14,总数:17,百分比:17.64)],
用户结果(用户名:“BS44”,
结果:[记录(赢:16,总数:17,百分比:94.11)],
UserResults(用户名:“fmiller”,
结果:[记录(获胜10次,总数17次,百分比58.83)],
UserResults(用户名:“iguerra”,结果:[
记录(胜数:12,总数:17,得票率:70.58),
记录(胜:23,平:12,总数:17,百分比:70.58),
]),
]
让sortedUsers=users.sorted{lhv,rhv in
//查找要比较的左侧项目的最大记录
让lhvMax=lhv.results.max(by:{($0.wins,$0.ties)<($1.wins,$1.ties)})!
//查找要比较的右侧项目的最大记录。
让rhvMax=rhv.results.max(by:{($0.wins,$0.ties)<($1.wins,$1.ties)})!
//比较包含正在比较的左手用户和右手用户的最大记录的赢数计数和结数的元组
return(lhvMax.wins,lhvMax.ties)>(rhvMax.wins,rhvMax.ties)
}
sortedUsers.forEach{print($0)}

如果只有一个结果(记录),为什么要有一个数组?您希望对结果wins求和,还是排序时应使用最高wins值?只需计算每个UserResults中的wins之和,然后进行排序?只需计算最高wins值。因此,您只需找到每个UserResults的最高wins值,然后根据该值进行排序。@Erictrung yes。最高的“wins”值应该是第一个,然后是下一个用户的最高wins值等等。它就像一个魅力!问题如果我现在想按第二个元素排序,比如说“平局打破者”,我该怎么做?我修改了结构,在实例中包含“平局”用户的“赢”数相等,因此如果两个用户的赢数相同,领带最多的应该是第一个?为什么不简单地使用数字选项来比较元素
($0.results.first?.wins??)。比较($1.results.first?.wins??),选项:.numeric)==.orderedDescending
是的,你上周给我展示了这个技巧。