我正在尝试编写一个函数,它将使用一个字符数组(称为单词)和一个字符作为参数,并返回一个“word”数组,并在所有位置插入该字符:
示例
typealias Word = [Character]
func insert(letter: Character, into word: Word) -> [Word] {
}所以打电话:
insert("c", into: ["a", "b"])将返回:
[["c", "a", "b"], ["a", "c", "b"], ["a", "b", "c"]] 到目前为止我想出的最简单的方法是:
func insert(letter: Character, into word: Word) -> [Word] {
return Array<Int>(0...word.count).map() {
var newWord = word
newWord.insert(letter, atIndex: $0)
return newWord
}
}我从中得到了通用版本:
extension Array
{
func insert(element: T) -> [[T]] {
return (0...self.count).map() {
var newArray = self
newArray.insert(element, atIndex: $0)
return newArray
}
}
}但是,这涉及到输入单词的可变副本。是否有一种更好/更优雅/更简单(功能)的方法来实现这一点?
发布于 2014-12-14 12:14:53
我会将“非变异数组插入”移动到一个单独的方法:
extension Array
{
func arrayByInserting(element: T, atIndex: Int) -> [T] {
var result = self
result.insert(element, atIndex: atIndex)
return result
}
func insert(element: T) -> [[T]] {
return (0 ... self.count).map() { self.arrayByInserting(element, atIndex: $0) }
}
}那么,您的问题(据我理解)对于arrayByInserting方法是否有更好的方法。实际上你的方法在我看来不错。您需要返回一个新的数组,所以您也可以从self的副本开始。
它可以用切片写得稍微短一点:
func arrayByInserting(element: T, atIndex: Int) -> [T] {
return self[0 ..< atIndex] + [element] + self[atIndex ..< self.count]
}然而,一次快速测试表明,该方法比您的方法慢了大约10倍。
发布于 2014-12-14 15:02:51
您可以在Swift中找到非常有趣的函数示例:objc.io函数片段
“排列”片段就是你要找的东西。
这里是一个简化的例子。但我强烈推荐objc.io片段。
数组扩展:
extension Array {
var decompose : (head: T, tail: [T])? {
return (count > 0) ? (self[0], Array(self[1..<count])) : nil
}
}在这里,泛型函数:
func between<T>(x: T, ys: [T]) -> [[T]] {
if let (head, tail) = ys.decompose {
return [[x] + ys] + between(x, tail).map { [head] + $0 }
} else {
return [[x]]
}
}这应该可以解决你的问题:
let char: Character = "c"
let charArray = ["a", "b"] as [Character]
let r = between(char, charArray)https://stackoverflow.com/questions/27469134
复制相似问题