【问题标题】:Sort Array of Objects With Some Conditions使用某些条件对对象数组进行排序
【发布时间】:2017-11-27 13:51:16
【问题描述】:

我有一个 Users 对象数组:

Class Users {
    var firstName:String!
    var lastName:String!
    var status:Int!

    override init(fn: String, ln: String, s: Int) {
        self.firstName = fn
        self.lastName = ln
        self.status = s
    }
}

var users:[Users] = [Users]()
users.append(Users(fn:"a", ln:"b", s:1))
users.append(Users(fn:"c", ln:"d", s:3))
users.append(Users(fn:"e", ln:"f", s:2))
users.append(Users(fn:"g", ln:"h", s:1))
users.append(Users(fn:"i", ln:"j", s:1))
users.append(Users(fn:"k", ln:"l", s:2))

我知道根据状态对这个数组进行排序的方法

users = users.sorted(by: {$0.status > $1.status})

但是,我如何对用户数组进行排序,其中 2 在顶部,然后是 3,在最后 1 中,即 [2,2,3,1,1,1]

【问题讨论】:

  • s 的值是否固定?必须在 2 , 3 , 1 中?
  • 如果你想要一个特定的顺序,排序数组的目的是什么?
  • @JonSnow 我有 's' 的随机值,即状态
  • 也许你应该定义一个代表状态的枚举。然后,您可以为每个状态类型分配一个 int 值,并根据该值进行排序。
  • @marshallino16 2=在线,1=离线,3=忙碌

标签: arrays swift sorting


【解决方案1】:

考虑重构:

类到结构:

struct User {
    var firstName:String!
    var lastName:String!
    var status:Status
}

状态枚举:

enum Status: Int {
    case online, busy, offline
}

人口:

var users: [User] = [
    User(firstName: "a", lastName: "b", status: .online),
    User(firstName: "c", lastName: "d", status: .offline),
    User(firstName: "e", lastName: "f", status: .busy),
    User(firstName: "g", lastName: "h", status: .online),
    User(firstName: "i", lastName: "j", status: .online),
    User(firstName: "k", lastName: "l", status: .busy)
]

排序:

users = users.sorted(by:{$0.status.rawValue < $1.status.rawValue })

users.forEach { print($0) }

输出:

User(firstName: a, lastName: b, status: .online)
User(firstName: g, lastName: h, status: .online)
User(firstName: i, lastName: j, status: .online)
User(firstName: e, lastName: f, status: .busy)
User(firstName: k, lastName: l, status: .busy)
User(firstName: c, lastName: d, status: .offline)

【讨论】:

    【解决方案2】:

    试试这个。这将根据 order 数组进行排序。如果缺少任何状态将被移动到数组的底部。

    let order = [2,3,1]
    users = users.sorted(by: { order.index(of: $0.status) ?? Int.max < order.index(of: $1.status) ?? Int.max })
    // 2,2,3,1,1,1
    

    假设顺序数组中缺少 3

    let order = [2,1]
    users = users.sorted(by: { order.index(of: $0.status) ?? Int.max < order.index(of: $1.status) ?? Int.max })
    // 2,2,1,1,1,3
    

    【讨论】:

    • 太棒了!这就是我要的。谢谢。
    【解决方案3】:

    为您的排序顺序使用查找。

    let sortPriority: [Int: Int] = [ 1: 3, 2: 1, 3: 2]
    

    您还可以使用变异的sort 对数组进行就地排序,而不是返回一个副本的sorted,因为看起来您正在丢弃原始数组:

    users.sort(by: {sortPriority [$0.status, default: Int.max] < sortPriority [$1.status, default: Int.max]})
    print(users.flatMap{$0.status})
    

    输出:

    [2, 2, 3, 1, 1, 1]
    

    【讨论】:

    • 感谢您的支持,这个解决方案也很好我知道了。
    猜你喜欢
    • 2016-09-01
    • 2021-06-11
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多