Swift 5 中结构数组的嵌套排序
Nested Sort in Struct Array in Swift 5
这是我的模型
struct ContactModel{
var alphabet: String
var users: [UserModel]
}
struct UserModel{
var firstname: String
var lastname: String
}
使用 sort
按字母顺序排序在这里工作正常是代码:
contactArray.sort{ [=12=].alphabet < .alphabet }
现在,我想根据 UserModel
firstname
进行升序或降序排序
我尝试嵌套排序,但给了我不同的错误,比如
Comparable and Binary operator '<' cannot be applied to two '[UserModel]' operands
我在 Whosebug 上搜索了这方面的内容,但没有找到嵌套排序和操作数错误的解决方案。
我这样试过
let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
[=14=].firstname.lowercased() < .firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
[=14=].firstname.lowercased() < .firstname.lowercased()
})
return users1 < users2
}
但是它不起作用。我无法在这里进行嵌套排序的唯一问题是对 UserModel 的名字进行排序,我们有 ContactModel
Array
var contactArray = [ContactModel](){
didSet{
contactArray.sort{ [=15=].alphabet < .alphabet } //Simple Sort working fine.
let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
[=15=].firstname.lowercased() < .firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
[=15=].firstname.lowercased() < .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 { [=10=].alphabet < .alphabet }
let fullySorted = contactArray.map( { ContactModel(alphabet: [=10=].alphabet, users: [=10=].users.sorted { [=10=].firstname < .firstname }) } )
map
和sort
函数也可以互换,即首先映射到一个新数组,然后根据字母表排序。
原数组:
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 { [=13=].alphabet < .alphabet }.map( { ContactModel(alphabet: [=13=].alphabet, users: [=13=].users.sorted { [=13=].firstname < .firstname }) } )
这是我的模型
struct ContactModel{
var alphabet: String
var users: [UserModel]
}
struct UserModel{
var firstname: String
var lastname: String
}
使用 sort
按字母顺序排序在这里工作正常是代码:
contactArray.sort{ [=12=].alphabet < .alphabet }
现在,我想根据 UserModel
firstname
进行升序或降序排序
我尝试嵌套排序,但给了我不同的错误,比如
Comparable and Binary operator '<' cannot be applied to two '[UserModel]' operands
我在 Whosebug 上搜索了这方面的内容,但没有找到嵌套排序和操作数错误的解决方案。
我这样试过
let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
[=14=].firstname.lowercased() < .firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
[=14=].firstname.lowercased() < .firstname.lowercased()
})
return users1 < users2
}
但是它不起作用。我无法在这里进行嵌套排序的唯一问题是对 UserModel 的名字进行排序,我们有 ContactModel
Array
var contactArray = [ContactModel](){
didSet{
contactArray.sort{ [=15=].alphabet < .alphabet } //Simple Sort working fine.
let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
[=15=].firstname.lowercased() < .firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
[=15=].firstname.lowercased() < .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 { [=10=].alphabet < .alphabet }
let fullySorted = contactArray.map( { ContactModel(alphabet: [=10=].alphabet, users: [=10=].users.sorted { [=10=].firstname < .firstname }) } )
map
和sort
函数也可以互换,即首先映射到一个新数组,然后根据字母表排序。
原数组:
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 { [=13=].alphabet < .alphabet }.map( { ContactModel(alphabet: [=13=].alphabet, users: [=13=].users.sorted { [=13=].firstname < .firstname }) } )