如何在不改变主数组中原始顺序的情况下通过 BOOL 快速排序?

NSP*_*tik 4 arrays sorting nsarray ios swift

我有一组模型,它有 2 个属性:

1.标题 (字符串)

2. isSelected(布尔)

我想根据isSelected属性对它们进行排序,使其相对于源数组的序列进行排序。例如,如果全部为 FALSE 或 TRUE,则排序后应该有相同的输出。

但如果我使用以下方法,它会在基于 BOOL 属性对它们进行排序后更改原始排序。

someArray = array.sort { $0.selected && !$1.selected }
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能保留原来的顺序?

编辑1

title图片中未显示排序顺序。可能服务器向我发送了 4 个标题为 Z、Y、P、A 的对象。因此,如果全部都是假的,一旦我排序,它应该像 Z 假,Y 假,P 假,A 假。

Sh_*_*han 6

你需要

someArray = array.sorted (by:{ $0.selected && !$1.selected && <#Add more conditions #>})
Run Code Online (Sandbox Code Playgroud)

sorted (by与原始数组不同,不会改变原始数组sort

https://developer.apple.com/documentation/swift/array/1688499-sort

https://developer.apple.com/documentation/swift/array/2296815-sorted


Sul*_*han 6

您可以使用过滤操作更有效地完成排序,而不是排序:

let newArray = array.filter { $0.selected } + array.filter { !$0.selected }
Run Code Online (Sandbox Code Playgroud)

不幸的是,Array.sorted不能保证稳定的排序,因此您不能只按一个属性排序并期望保留原始排序。

不过,您可以轻松实现稳定排序(例如/sf/answers/3538203301/

然后你可以简单地使用:

let newArray = array.stableSorted {    
   let numeric1 = $0.selected ? 0 : 1
   let numeric2 = $1.selected ? 0 : 1

   return numeric1 <= numeric2
}
Run Code Online (Sandbox Code Playgroud)

或者

let newArray = array.stableSorted {
   return $0.selected == $1.selected || $0.selected
}
Run Code Online (Sandbox Code Playgroud)