gpt4 book ai didi

arrays - Swift 5 结构数组中的嵌套排序

转载 作者:行者123 更新时间:2023-12-05 04:39:08 24 4
gpt4 key购买 nike

这是我的模型

struct ContactModel{
var alphabet: String
var users: [UserModel]
}

struct UserModel{
var firstname: String
var lastname: String
}

使用 sort 按字母顺序排序在这里工作正常是代码:

contactArray.sort{ $0.alphabet < $1.alphabet }

现在,我想根据 UserModel firstname 升序或降序排序我尝试使用嵌套排序,但给了我不同的错误,比如

Comparable and Binary operator '<' cannot be applied to two '[UserModel]' operands

我在 StackOverflow 上搜索了这方面的内容,但没有找到嵌套排序和操作数错误的解决方案。

我试过这种方式

let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})

return users1 < users2
}

但是它不起作用。我无法在这里进行嵌套排序的唯一问题是对 UserModel 的名字和我们有 ContactModel 数组

进行排序
var contactArray = [ContactModel](){
didSet{

contactArray.sort{ $0.alphabet < $1.alphabet } //Simple Sort working fine.

let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})

return users1 < users2
}

self.tableView.reloadData()
}
}

数组包含这个

 func getAllContacts() -> [ContactModel]{
return [
ContactModel(alphabet: "B", users: [
UserModel(firstname: "Bhaswar", lastname: "Patel"),
UserModel(firstname: "Bunty", lastname: "Patel")
]),
ContactModel(alphabet: "N", users: [
UserModel(firstname: "Nilesh", lastname: "Darji")
]),
ContactModel(alphabet: "Y", users: [
UserModel(firstname: "Yogesh", lastname: "Patel"),
UserModel(firstname: "Yash", lastname: "Patel")
])
]
}

结果:

字母部分排序工作正常需要排序用户现在使用这个 Yash 的名字是第一个然后是 Yogesh

任何建议表示赞赏。谢谢!

最佳答案

下面的代码首先根据字母对 ContactModel 数组进行排序。然后,它将这个排序后的数组映射到一个新数组,其中 UserModel 数组也进行了排序。

contactArray.sort { $0.alphabet < $1.alphabet }
let fullySorted = contactArray.map( { ContactModel(alphabet: $0.alphabet, users: $0.users.sorted { $0.firstname < $1.firstname }) } )

mapsort 函数也可以互换,即首先映射到一个新数组,然后根据字母表排序。原始数组:

var contactArray = [
ContactModel(alphabet: "B", users: [
UserModel(firstname: "Bhaswar", lastname: "Patel"),
UserModel(firstname: "Bunty", lastname: "Patel")
]),
ContactModel(alphabet: "N", users: [
UserModel(firstname: "Nilesh", lastname: "Darji")
]),
ContactModel(alphabet: "Y", users: [
UserModel(firstname: "Yogesh", lastname: "Patel"),
UserModel(firstname: "Yash", lastname: "Patel")
])
]

将变为(Yash 和 Yogesh 现在按字母顺序排列):

var contactArray = [
ContactModel(alphabet: "B", users: [
UserModel(firstname: "Bhaswar", lastname: "Patel"),
UserModel(firstname: "Bunty", lastname: "Patel")
]),
ContactModel(alphabet: "N", users: [
UserModel(firstname: "Nilesh", lastname: "Darji")
]),
ContactModel(alphabet: "Y", users: [
UserModel(firstname: "Yash", lastname: "Patel"),
UserModel(firstname: "Yogesh", lastname: "Patel")
])
]

如果有另一个 ContactModel 带有 alphabet = "A",那么这将是 contactArray 中的第一个。

如果您确实需要,您可以甚至将其缩减为一行代码。但是,我不推荐它,因为对于不熟悉它的人来说,排序和映射会变得难以阅读。

// Single line of code solution (I wouldn't recommend this because of readability)
let fullySorted = contactArray.sorted { $0.alphabet < $1.alphabet }.map( { ContactModel(alphabet: $0.alphabet, users: $0.users.sorted { $0.firstname < $1.firstname }) } )

关于arrays - Swift 5 结构数组中的嵌套排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70472033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com