将一个单词拆分成对

时间:2016-03-23 16:20:53

标签: swift

我无法想象在Swift中重新创建以下代码的优雅方式:

在Python中(正确,简洁,优雅):

>>> def splits(word):
...     return [(word[:i], word[i:]) for i in range(len(word) + 1)]
... 
>>> splits("abc")
[('', 'abc'), ('a', 'bc'), ('ab', 'c'), ('abc', '')]

在Swift中(虚假而有点偏执):

func splits(word: String) -> [(String,String)] {
    return word.characters.indices.map {
        return (word[word.startIndex..<$0], word[$0..<word.endIndex])
    }
}

splits("abc")

"[("", "abc"), ("a", "bc"), ("ab", "c")]"

如您所见,Swift版本缺少最后一对。如何知道字符串上的索引不会传递给地图闭包中的最后一个字符,我怎么能实现这一点(除了手动添加最后一对)?

编辑:

我从答案中改编了这个:

func splits(word: String) -> [(String,String)] {
    let chars = word.characters
    return (0...chars.count).map {
        (String(chars.dropFirst($0)),String(chars.dropLast(chars.count - $0)))
    }
}

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案

func splits(word: String) -> [(String,String)] {
    var arr:[(String,String)] = []
    (0...word.characters.count).forEach {
        arr.append(( String(word.characters.dropFirst($0)),String(word.characters.dropLast(word.characters.count - $0))))
    }
    return arr
}

let str = "abc"
let arr = splits(str)
print(arr) // [("abc", ""), ("bc", "a"), ("c", "ab"), ("", "abc")]

答案 1 :(得分:1)

另一种可能的解决方案:

func splits(word: String) -> [(String, String)] {

    return (0 ... word.characters.count).map { 
         (word.substringToIndex(word.startIndex.advancedBy($0)),
            word.substringFromIndex(word.endIndex.advancedBy(-$0)))
    }
}

splits("abc")
// [("", "abc"), ("a", "bc"), ("ab", "c"), ("abc", "")]