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。谢谢。我忘了给新变量分配排序数据。谢谢。我忘了给一个新变量分配排序数据。