Arrays 在Swift中使用两个参数对结构对象数组进行排序
我有以下代码:Arrays 在Swift中使用两个参数对结构对象数组进行排序,arrays,swift,tuples,Arrays,Swift,Tuples,我有以下代码: struct MyData { var company = String(); var score:Int; } let data = [ MyData(company: "smiths", score: 4 ), MyData(company: "lukes", score: 4), MyData(company: "lukes", score: 9) ] extension MyData: CustomStringConvertib
struct MyData {
var company = String();
var score:Int;
}
let data = [
MyData(company: "smiths", score: 4 ),
MyData(company: "lukes", score: 4),
MyData(company: "lukes", score: 9)
]
extension MyData: CustomStringConvertible {
var description: String {
return "(\(company), \(score))"
}
}
data.sorted { ($0.company, $1.score) < ($1.company, $0.score) }
print(data)
struct MyData{
var company=String();
var评分:Int;
}
让数据=[
MyData(公司:“史密斯”,分数:4),
MyData(公司名称:“lukes”,分数:4),
MyData(公司:“lukes”,分数:9)
]
扩展名MyData:CustomStringConvertible{
变量说明:字符串{
返回“(\(公司),\(分数))”
}
}
data.sorted{($0.company,$1.score)<($1.company,$0.score)}
打印(数据)
我的输出是:
[(史密斯,4),(卢克斯,4),(卢克斯,9)]
但是,我希望情况正好相反:
[(卢克斯,9)、(卢克斯,4)、(史密斯,4)]
有人能告诉我我做错了什么吗?使用注释中描述的排序规则,您的自定义排序功能应该是这样的:
let sorted = data.sorted(by: { this, next in
if this.company < next.company {
return true //first sort based on ascending company name
} else if this.company == next.company {
return this.score > next.score //if company name is the same, sort by descending score
} else {
return false //if company name is later in the alphabet, put it later in the sorted output
}
})
print(sorted)
let sorted=data.sorted(按:{this,下一个在
如果this.companynext.score//如果公司名称相同,则按分数降序排序
}否则{
返回false//如果公司名称在字母表中的位置较晚,则将其放在排序后的输出中
}
})
打印(已排序)
输出:
[(卢克斯,9)、(卢克斯,4)、(史密斯,4)]
此外,您使用的代码不起作用有两个原因:sorted返回一个包含排序结果的新数组,它不是一个变异函数。由于数据是不可变的,它甚至不能与变异函数一起工作。使用注释中描述的排序规则,您的自定义排序函数应该是这样的:
let sorted = data.sorted(by: { this, next in
if this.company < next.company {
return true //first sort based on ascending company name
} else if this.company == next.company {
return this.score > next.score //if company name is the same, sort by descending score
} else {
return false //if company name is later in the alphabet, put it later in the sorted output
}
})
print(sorted)
let sorted=data.sorted(按:{this,下一个在
如果this.companynext.score//如果公司名称相同,则按分数降序排序
}否则{
返回false//如果公司名称在字母表中的位置较晚,则将其放在排序后的输出中
}
})
打印(已排序)
输出:
[(卢克斯,9)、(卢克斯,4)、(史密斯,4)]
此外,您使用的代码不起作用有两个原因:sorted返回一个包含排序结果的新数组,它不是一个变异函数。它甚至不能与变异函数一起工作,因为数据是不可变的。所以我发现我的解决方案几乎就在那里。由于sorted函数返回一个新数组,并且实际上没有对调用它的数组进行排序,因此我的print语句总是打印原始集合。我的问题的解决方案是:
var myArray = data.sorted { ($0.company, $1.score) < ($1.company, $0.score) }
print(myArray)
var myArray=data.sorted{($0.company,$1.score)<($1.company,$0.score)}
打印(myArray)
非常感谢您的帮助。:-) 所以我发现我的解决方案就快到了。由于sorted函数返回一个新数组,并且实际上没有对调用它的数组进行排序,因此我的print语句总是打印原始集合。我的问题的解决方案是:
var myArray = data.sorted { ($0.company, $1.score) < ($1.company, $0.score) }
print(myArray)
var myArray=data.sorted{($0.company,$1.score)<($1.company,$0.score)}
打印(myArray)
非常感谢您的帮助。:-) 您希望按
公司
升序排序,然后按得分
降序排序
首先–如注释中所述–必须将结果分配给一个新变量,print(data)
打印未排序的原始数组
排序算法应该是
如果公司相等,则按分数递减排序,否则按分数递增排序
let sortedData=data.sorted{($0.company==1.company)$0.score>1.score:$0.company<$1.company}
打印(数据)
您希望按公司
升序排序,然后按得分
降序排序
首先–如注释中所述–必须将结果分配给一个新变量,print(data)
打印未排序的原始数组
排序算法应该是
如果公司相等,则按分数递减排序,否则按分数递增排序
let sortedData=data.sorted{($0.company==1.company)$0.score>1.score:$0.company<$1.company}
打印(数据)
因此您的排序规则应该是:1)首先根据公司的字母顺序排序2)如果公司相同,则根据分数排序?顺便说一下,您正在打印原始阵列sorted
返回一个包含排序结果的新数组,它不是一个变异函数。它甚至不能与变异函数一起工作,因为数据
是不可变的。如果排序是反向的,请将
更改为code>@DávidPászor。因此,您的排序规则应该是:1)首先根据公司的字母顺序排序2)如果公司相同,则根据分数排序?顺便说一下,您正在打印原始阵列sorted
返回一个包含排序结果的新数组,它不是一个变异函数。它甚至不能使用变异函数,因为数据
是不可变的。如果排序是反向的,请将
@DávidPásztor。谢谢。我忘了给新变量分配排序数据。谢谢。我忘了给一个新变量分配排序数据。