gpt4 book ai didi

arrays - 通过带有条件的自定义属性和次要自定义属性 desc 订购 swift 数组

转载 作者:行者123 更新时间:2023-11-28 08:09:34 25 4
gpt4 key购买 nike

我有一个自定义对象数组。该对象包含一个属性 endDate。

我需要能够以类似于以下 sql 的方式对我的数组进行排序:

order by enddate = 0 desc, enddate desc

我知道如何做第二部分:

arr.sorted(by : {$0.enddate > $1.enddate})

但我不知道如何有条件地按结束日期排序

输入

[{x: "blah", enddate : 123456}, {x: "blah2", enddate : 234567}, {x: "blah3", enddate : 345678}, {x: "blah4", enddate : 0}]

所以我想让输出的结束日期降序,除非结束日期为0,例如0、345678、234567、123456

最佳答案

在实现这些类型的自定义排序顺序时,您应该牢记传递给 sorted(by:) 的排序谓词的语义要求。这些要求在 in the documentation 中列出:

The predicate must be a strict weak ordering over the elements. Thatis, for any elements a, b, and c, the following conditions must hold:

  • areInIncreasingOrder(a, a) is always false. (Irreflexivity)
  • If areInIncreasingOrder(a, b) and areInIncreasingOrder(b, c) are both true, then areInIncreasingOrder(a, c) is also true. (Transitivecomparability)
  • Two elements are incomparable if neither is ordered before the other according to the predicate. If a and b are incomparable, and b and care incomparable, then a and c are also incomparable. (Transitiveincomparability)

不遵守这些要求可能会导致数组排序不正确。因此,考虑到这些要求,这是一种表达排序顺序的方法:

struct S {
var endDate: Int
}

let arr = [S(endDate: 123456), S(endDate: 234567), S(endDate: 345678), S(endDate: 0)]

let result = arr.sorted {
switch ($0.endDate, $1.endDate) {
case (_, 0):
return false
case (0, _):
return true
case let (lhs, rhs):
return lhs > rhs
}
}

print(result)
// [S(endDate: 0), S(endDate: 345678), S(endDate: 234567), S(endDate: 123456)]

我们在这里使用的排序谓词是:

  • 非自反性:(0, 0) 为假。 (a, a) 也为假的任何其他 a != 0,因为 > 也是非自反的。
  • 可传递的可比性:(0, a),其中 a != 0 为真,(a, 0) 为假。 > 处理的任何其他组合,具有可传递性。
  • 传递性不可比:对于给定的至少包含一个 0 的对,另一个元素必须是 0 才能不可比。因此 a == b == c == 0 ,和 (a, c) 确实是不可比的。 > 处理的任何其他组合,传递性无与伦比。

关于arrays - 通过带有条件的自定义属性和次要自定义属性 desc 订购 swift 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com