gpt4 book ai didi

arrays - 将项目移动到集合开头的最佳方法

转载 作者:搜寻专家 更新时间:2023-10-31 22:11:06 27 4
gpt4 key购买 nike

如果我有收藏

let initial = [ "a", "b", "c", "d", "e" ]

我想将一个项目从该集合移到开头(但保持其他项目的顺序不变)

let final = initial.placeFirst { $0 == "b" }
assert(final == [ "b", "a", "c", "d", "e" ])

什么是实现 placeFirst 的最佳方式?

我的示例包含 Equatable 元素 - 这只是为了让问题更易读,遗憾的是现实生活中并非如此,因此将谓词传递到 placeFirst 中在开始时为我想要的项目返回 true

对于我的用例,应该只有一个项目与谓词匹配 - 如果有多个匹配项,则将任何(或部分或全部)匹配元素放在开头就可以了。

我有一些想法,但似乎这种问题会有一个非常巧妙的解决方案,它使用我还不知道的一些集合/序列。

PS 我确实意识到这听起来很像家庭作业问题 - 我保证不是:)

最佳答案

RangeReplaceableCollection (Swift 3) 上作为变异方法的可能实现:

extension RangeReplaceableCollection {
mutating func placeFirst(where predicate: (Iterator.Element) -> Bool) {
if let index = index(where: predicate) {
insert(remove(at: index), at: startIndex)
}
}
}

例子:

var array = [ "a", "b", "c", "d", "e" ]
array.placeFirst(where: { $0 == "b" })
print(array) // ["b", "a", "c", "d", "e"]

类似于How do I shuffle an array in Swift?你可以添加一个非变异方法采用任意序列并返回数组:

extension Sequence {
func placingFirst(where predicate: (Iterator.Element) -> Bool) -> [Iterator.Element] {
var result = Array(self)
result.placeFirst(where: predicate)
return result
}
}

例子:

let initial = [ "a", "b", "c", "d", "e" ]
let final = initial.placingFirst { $0 == "b" }
print(final) // ["b", "a", "c", "d", "e"]

关于arrays - 将项目移动到集合开头的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45190455/

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