Swift:无法删除字符串数组中的“”[关闭]

问题描述 投票:1回答:4

我试图从字符串数组的后面删除""" ",直到最后一项包含一些文本,但我的实现没有拿起" "

到目前为止我的实施:

var array = ["A", "B", "", "C", "D", " ", " ", ""]

while true {
    if (array.last == " " || array.last == "") {
        array.removeLast()
    } else {
        break
    }
}

我想要的输出是["A", "B", "", "C", "D"],但...... 我目前的输出是["A", "B", "", "C", "D", " ", " "],在遇到while后,breaks循环只是" "

任何建议为什么它没有拿起" "? 谢谢。

swift
4个回答
3
投票

解决这个问题的一种方法是反转收集(懒得完成)并丢弃不需要的物品,直到遇到想要的物品。然后,再次反转收集。

let array = ["A", "B", "", "C", "D", " ", " ", ""]

let filtered = array.reversed().drop(while: {
    $0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
}).reversed() as [String]

print(filtered) // "["A", "B", "", "C", "D"]\n"

请注意,如果" "不是正常空间,则检查可能会失败,例如非中断空格(Unicode检查点U + 00A0)。这可能是您首先遇到的问题。因此修剪字符串(它只从开始和结束中删除字符)并检查结果是否为空字符串。


3
投票

将您的状况移至while并确保在操作后检查正确的阵列。

var array = ["A", "B", "", "C", "D", " ", " ", ""]

while array.last == " " || array.last == "" {
    array.removeLast()
}

print(array) // ["A", "B", "", "C", "D"]

2
投票

只是为了好玩,让我们以通用的方式扩展Array这个功能,同时从外部提供更灵活的条件。

类似于Arrays有drop(while:),我们可以像这样制作一个dropLast(while:)

extension Array {
    func dropLast(while handler: (Element)->Bool) -> Array {
        var array = self
        while let last = array.last, handler(last) {
            array.removeLast()
        }
        return array
    }
}

Usage Example:

let array = ["", "A", "B", "", "C", "D", " ", " ", ""]
let modified = array.dropLast { $0.trimmingCharacters(in: .whitespaces).isEmpty }
print(modified) //["", "A", "B", "", "C", "D"]

Bonus:

它也可以处理其他类型的数组,并且由于条件没有融入功能,因此它具有灵活性和可重用性。

let array = [0, 1, 2, 3, 0, 5, 6, 7, 0, -1, 0, -2]

//Drop (from tail) all numbers less than 1
let modified = array.dropLast(while: { (val) -> Bool in
    return val < 1
})
print(modified) //[0, 1, 2, 3, 0, 5, 6, 7]

0
投票

基本上你的解决方案很好。但你可以使它更通用的“”,“ ”,“”,“ ”,....:

import Foundation
var array = ["A", "B", "", "C", "D", " ", " ", ""]
while true {
    let shouldRemoveLast = array.last?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ?? false
    if (shouldRemoveLast) { array.removeLast() } else { break }
}
© www.soinside.com 2019 - 2024. All rights reserved.