【问题标题】:How to split a string into 2 arrays Swift 4如何将字符串拆分为 2 个数组 Swift 4
【发布时间】:2018-05-14 09:16:51
【问题描述】:

例如我有一个这样的数组:

var 数组 = ["Hello", "World", "1" , "2"]

如何将其拆分为 2 个数组?一个具有字符串值,一个具有类似的 int 值

arrayStr = ["Hello", "World"]

数组整数 = ["1", "2"]

【问题讨论】:

  • arrayStr = ["Hello", "World"]arrayStr = ["Hello, World"]?这真的很不一样(“int”问题也是一样的)。
  • 感谢您的评论。我已经编辑过
  • 分割[String]的标准是什么?是关于值是否可能是数值?

标签: arrays swift string int swift4


【解决方案1】:

试试看:使用loopif-letif-is 条件来识别数组元素的数据类型并附加到相关数组中。

这是测试示例:

let array = ["Hello", "World ", "1" , "2"]

var arrayStr = [String]()
var arrayInt = [Int]()


for arrayElement in array {

    if let intValue = Int(arrayElement) {
        arrayInt.append(intValue)
    }  else {
        arrayStr.append(arrayElement)
    }
}

print("arrayStr - \(arrayStr)")
print("arrayInt - \(arrayInt)")

结果:

arrayStr - ["Hello", "World"]
arrayInt - [1, 2]

【讨论】:

  • 这不起作用,因为 else 语句中的汽车永远不会创建整数。对于给定的数组,arrayInt 将为空,因为它只包含字符串——其中一些可能用于实例化 Ints。但是演员阵容是行不通的。
  • let intValue = arrayElement as? Int 这不会按预期工作,现在所有项目都将进入 arrayStr。
  • 在此处查看此代码是否按预期工作:gist.github.com/tweedeviking/5abf77d2222bda17824290b519e469cf
  • 所以现在你有了与Moe Abdul-Hameed 完全相同的解决方案——唯一的区别是他使用forEach 调用,而你使用for 循环进行迭代。所以根本没有真正的区别。
【解决方案2】:

你可以过滤一个字符串是否可以用来创建一个int:

let array = ["Hello", "World", "1" , "2"]

let intArray = array.filter { (string) -> Bool in
    return Int(string) != nil
}

如果不是,则将其视为字符串

let stringArray = array.filter { (string) -> Bool in
    return Int(string) == nil
}

结果:

print(stringArray)
print(intArray)

将打印

["Hello", "World"]
["1", "2"]

如果 intArry 确实应该。包含 Int,而不是表示 Int 的字符串,可以使用 map。

let intArray = array.filter { (string) -> Bool in
    return Int(string) != nil
}.map { return Int($0)!}

短代码:

let array = ["Hello", "World", "1" , "2"]
let stringArray = array.filter { Int($0) == nil }
let intArray = array.flatMap (Int.init)

【讨论】:

  • "filter + map == flatMap" → let intArray = array.flatMap (Int.init)
  • 这需要通过array 2 次才能达到目标,对吧?
  • @MoeAbdul-Hameed:嗯,我不希望 iOS 应用程序能够处理包含数亿个项目的数组。因此,如果需要,请使用简洁紧凑的语法。同样使用我的方法,所有涉及的数组都可以是let 常量。不变性消除了一整类可能的错误。或者用 Knuth 的话来说:«Premature optimization is the root of all evil»
  • @vikingosegundo 好观点,谢谢你的解释。
【解决方案3】:

一次性解决方案,你可以这样做:

var intArray = [Int]()
var stringArray = [String]()
array.forEach {
    if let integer = Int($0) {
        intArray.append(integer)
    } else {
        stringArray.append($0)
    }
}

print(intArray) // [1, 2]
print(stringArray) // ["Hello", "World"]

我们在这里所做的只是创建了 2 个空数组,一个用于Ints,一个用于Strings。

然后我们迭代主数组的值,如果我们能够将值转换为Int,那么它就是Int,我们应该将它添加到intArray。如果没有,我们会将其添加到stringArray

【讨论】:

    【解决方案4】:

    这是一种只检查条件一次的方法。它使用reduce 将数组拆分为两个数组。

    let sepArray = array.reduce(([String](), [Int]()), {
        if let int = Int($1) {
            return ($0.0, $0.1 + [int])
        } else {
            return ($0.0 + [$1], $0.1)
        }
    })
    sepArray //(["Hello", "World"], [1, 2])
    

    您也可以通用地使用它。对于这种方法,您传入一个尝试将您的元素映射到新类型的条件。它将条件返回不为零的每个元素移动到第二个数组中。

    extension Array {
        func separateElements<T>(where condition: (Element) -> T?) -> ([Element], [T]) {
            return self.reduce(([Element](), [T]()), {
                if let elementToSeparate = condition($1) {
                    return ($0.0, $0.1 + [elementToSeparate])
                } else {
                    return ($0.0 + [$1], $0.1)
                }
            })
        }
    }
    

    你可以这样使用它。

    array.separateElements(where: { Int($0) }) //(["Hello", "World"], [1, 2])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 2017-07-16
      • 2014-10-29
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多