首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速插入字符数组,函数解决方案

快速插入字符数组,函数解决方案
EN

Stack Overflow用户
提问于 2014-12-14 12:09:48
回答 2查看 336关注 0票数 4

我正在尝试编写一个函数,它将使用一个字符数组(称为单词)和一个字符作为参数,并返回一个“word”数组,并在所有位置插入该字符:

示例

代码语言:javascript
复制
typealias Word = [Character]

func insert(letter: Character, into word: Word) -> [Word] {
}

所以打电话:

代码语言:javascript
复制
insert("c", into: ["a", "b"])

将返回:

代码语言:javascript
复制
[["c", "a", "b"], ["a", "c", "b"], ["a", "b", "c"]] 

到目前为止我想出的最简单的方法是:

代码语言:javascript
复制
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
    }
}

我从中得到了通用版本:

代码语言:javascript
复制
extension Array
{
    func insert(element: T) -> [[T]] {

        return (0...self.count).map() {
            var newArray = self
            newArray.insert(element, atIndex: $0)
            return newArray
        }
    }
}

但是,这涉及到输入单词的可变副本。是否有一种更好/更优雅/更简单(功能)的方法来实现这一点?

EN

回答 2

Stack Overflow用户

发布于 2014-12-14 12:14:53

我会将“非变异数组插入”移动到一个单独的方法:

代码语言:javascript
复制
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的副本开始。

它可以用切片写得稍微短一点:

代码语言:javascript
复制
func arrayByInserting(element: T, atIndex: Int) -> [T] {
    return self[0 ..< atIndex] + [element] + self[atIndex ..< self.count]
}

然而,一次快速测试表明,该方法比您的方法慢了大约10倍。

票数 2
EN

Stack Overflow用户

发布于 2014-12-14 15:02:51

您可以在Swift中找到非常有趣的函数示例:objc.io函数片段

“排列”片段就是你要找的东西。

这里是一个简化的例子。但我强烈推荐objc.io片段。

数组扩展:

代码语言:javascript
复制
extension Array {
   var decompose : (head: T, tail: [T])? {
      return (count > 0) ? (self[0], Array(self[1..<count])) : nil
   }
}

在这里,泛型函数:

代码语言:javascript
复制
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]]
 }
}

这应该可以解决你的问题:

代码语言:javascript
复制
let char: Character = "c"
let charArray = ["a", "b"] as [Character]
let r = between(char, charArray)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27469134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档