基于自动换行的快速拆分子字符串

时间:2019-05-22 10:40:31

标签: swift string algorithm

初级开发人员。我目前正在尝试实现将String的每n个字符分割成一个子字符串。

这是我的函数代码

public func split(every: Int) -> [String] {
    var result = [String]()

    for i in stride(from: 0, to: self.count, by: every) {
        let startIndex = self.index(self.startIndex, offsetBy: i)
        let endIndex = self.index(startIndex, offsetBy: every, limitedBy: self.endIndex) ?? self.endIndex
        result.append(String(self[startIndex..<endIndex]))
    }
    return result
}

上面的代码按预期工作。但是上面的代码中缺少一个内容,即自动换行。这是示例字符串

let itemName = "Japanese Matcha SM w RB -L Special Edition And Americano MS w Brown Sugar Limited Edition"
print(itemName.split(every: 26))

结果将是

["Japanese Matcha SM w RB -L", " Special Edition And Ameri", "cano MS w Brown Sugar Limi", "ted Edition"]

注意

[" Special Edition And Ameri"], ["cano MS w Brown Sugar Limi"]

我试图找出如何基于每个n个字符进行自动换行算法,但是找不到任何线索。

例如,从上述情况来看,如何生成数组成为

[" Special Edition And"], ["Americano MS w Brown"], ["Sugar"]

因此,如您所见,该算法可能会检查每n个字符是否都有一个要切出的单词(基于n个字符的动态检查),因此会将切出的单词移到下一个数组中。

因此,在这种情况下,如果没有包装任何单词,该算法将巧妙地绕过每n个字符,该数量可以少于,但不超过n个字符。

我的解释清楚吗?谁能指导我?谢谢

2 个答案:

答案 0 :(得分:1)

这是该算法的一些简单实现,您可以从此开始。 首先,我们将单词切成字符串,然后将它们添加到临时字符串中,直到达到字符数限制为止。

let itemName = "Japanese Matcha SM w RB -L Special Edition And Americano MS w Brown Sugar Limited Edition"

let table = itemName.split(separator: " ")

let limit = 26
var tempString = ""

var finalResult: [String] = []

for item in table {
    tempString += item + " "

    if tempString.count >= limit {
        finalResult.append(tempString)
        tempString = ""
    }
}

print(finalResult)

答案 1 :(得分:0)

怎么样?

extension String {
    func split(every: Int) -> [String] {
        var result = [String]()
        let words = self.split(separator: " ")
        var line = String(words.first!)

        words.dropFirst().forEach { word in
            let word = " " + String(word)
            if line.count + word.count <= every {
                line.append(word)
            } else {
                result.append(line)
                line = word
            }
        }
        result.append(line)
        return result
    }
}