Swift结构体数组多级排序:按地址、物业名、卧室数排序
Swift 多单元房产数组按多优先级排序实现
需求说明
需对存储多单元房产信息的Property结构体数组排序,优先级依次为:站点地址(siteAddress)→ 物业名称(propertyName)→ 卧室数量(bedrooms),最终呈现按地址、物业、卧室数层级归类的有序结果。
原始定义与测试数据
struct Property: Hashable { var propertyName: String = "" var unitNumber: Int = 0 var bedrooms: Double = 0 var siteAddress: String = "" } var properties: Array<Property> = [] properties.append(Property(propertyName: "Tower A", unitNumber: 211, bedrooms: 2.5, siteAddress: "123 Main Street")) properties.append(Property(propertyName: "Tower A", unitNumber: 508, bedrooms: 1, siteAddress: "413 Another Street")) properties.append(Property(propertyName: "Tower B", unitNumber: 816, bedrooms: 2.5, siteAddress: "123 Main Street")) properties.append(Property(propertyName: "Tower A", unitNumber: 923, bedrooms: 1, siteAddress: "123 Main Street")) properties.append(Property(propertyName: "Tower A", unitNumber: 104, bedrooms: 3, siteAddress: "123 Main Street")) properties.append(Property(propertyName: "Tower B", unitNumber: 304, bedrooms: 2, siteAddress: "123 Main Street")) properties.append(Property(propertyName: "Tower B", unitNumber: 222, bedrooms: 1, siteAddress: "413 Another Street")) properties.append(Property(propertyName: "Tower A", unitNumber: 601, bedrooms: 2, siteAddress: "413 Another Street"))
优化后的排序实现
方式一:分层条件判断(可读性强)
properties = properties.sorted { this, next in // 第一优先级:比较站点地址 if this.siteAddress != next.siteAddress { return this.siteAddress < next.siteAddress } // 第二优先级:地址相同时比较物业名称 else if this.propertyName != next.propertyName { return this.propertyName < next.propertyName } // 第三优先级:地址和物业都相同时比较卧室数量(升序) else { return this.bedrooms < next.bedrooms } }
方式二:元组链式比较(简洁高效)
Swift支持元组按元素顺序依次比较,完全匹配优先级需求,代码更精简:
properties = properties.sorted { ($0.siteAddress, $0.propertyName, $0.bedrooms) < ($1.siteAddress, $1.propertyName, $1.bedrooms) }
排序结果验证
排序后的数组按层级展开如下,与期望结果完全一致:
- 123 Main Street
- Tower A
- 923, 1br
- 211, 2.5br
- 104, 3br
- Tower B
- 304, 2br
- 816, 2.5br
- Tower A
- 413 Another Street
- Tower A
- 508, 1br
- 601, 2br
- Tower B
- 222, 1br
- Tower A
内容的提问来源于stack exchange,提问作者SouthernYankee65
相关产品推荐
相关产品推荐

