如何将金字塔类型的String转换为Swift 4

时间:2018-05-02 11:53:45

标签: arrays swift string algorithm double

我需要通读下面给出的字符串,这样我就可以从这个字符串中分隔出双线数组,所以每一行都是不同的双数组。

var sampleString = """
                     55
                    94 48
                   95 30 96
                 77 71 26 67
                97 13 76 38 45
              07 36 79 16 37 68
             48 07 09 18 70 26 06
           18 72 79 46 59 79 29 90
          20 76 87 11 32 07 07 49 18
        27 83 58 35 71 11 25 57 29 85
       14 64 36 96 27 11 58 56 92 18 55
     02 90 03 60 48 49 41 46 33 36 47 23
    92 50 48 02 36 59 42 79 72 20 82 77 42
  56 78 38 80 39 75 02 71 66 66 01 03 55 72
 44 25 67 84 71 67 11 61 40 57 58 89 40 56 36
85 32 25 85 57 48 84 35 47 62 17 01 01 99 89 52
06 71 28 75 94 48 37 10 23 51 06 48 53 18 74 98 15
27 02 92 23 08 71 76 84 15 52 92 63 81 10 44 10 69 93
"""

例如:1st array = [55],2nd array = [94,48],依此类推。

我知道有类似的问题,我尝试了一些字符串方法:replacementOccurances(of:with :),trimmingCharacters(in :),split(seperator :)等等,我先尝试过这样的事情:< / p>

let lineSeperatedString = sampleString.replacingOccurrences(of: "\n", with: ",")

    let whiteSpaceTrimmedString = lineSeperatedString.replacingOccurrences(of: "  ", with: "")

    print(whiteSpaceTrimmedString)

然后输出就像:

 55,94 48, 95 30 96, 77 71 26 67,97 13 76 38 45,07 36 79 16 37 68, 48 07 09 18 70 26 06, 18 72 79 46 59 79 29 90,20 76 87 11 32 07 07 49 18,27 83 58 35 71 11 25 57 29 85, 14 64 36 96 27 11 58 56 92 18 55, 02 90 03 60 48 49 41 46 33 36 47 23,92 50 48 02 36 59 42 79 72 20 82 77 42,56 78 38 80 39 75 02 71 66 66 01 03 55 72, 44 25 67 84 71 67 11 61 40 57 58 89 40 56 36, 85 32 25 85 57 48 84 35 47 62 17 01 01 99 89 52,06 71 28 75 94 48 37 10 23 51 06 48 53 18 74 98 15,27 02 92 23 08 71 76 84 15 52 92 63 81 10 44 10 69 93

足够接近:(如果你忽略了每个部分开头用昏迷分隔的一些空格

然后我尝试了类似跟随的东西,以便我可以将它们转换为Ints但是它失败并将每个数字转换为int本身;

let myUpdatedArray = whiteSpaceTrimmedString.split(separator: "\n")
    for i in myUpdatedArray {
        let temp = i.map{String($0)}
        for j in temp {
            if let myInt = Int(j) {
                print(myInt)
            }
        }

    }

抱歉有点太长了,但我想展示我尝试过的所有东西,但是我自己无法解决这个问题

3 个答案:

答案 0 :(得分:5)

您可以使用

  • components(separatedBy: .newlines)将字符串分隔成 行,
  • map将行映射到(外部)数组
  • components(separatedBy: .whitespaces)将每一行分隔成 单独的数字,
  • compactMap(Double.init)将一行中的数字转换为Double的(内部)数组(忽略无效的浮点数)。

把它放在一起:

import Foundation

var sampleString = """
55
94 48
95 30 96
"""

let values = sampleString.components(separatedBy: .newlines).map {
    $0.components(separatedBy: .whitespaces).compactMap(Double.init)
}

print(values) // [[55.0], [94.0, 48.0], [95.0, 30.0, 96.0]]

答案 1 :(得分:3)

您可以使用split将字符串划分为一行,map来处理每一行,split再次将每行划分为单独的字符串,然后{{} 1}} compactMap将项目转换为Double.init s:

Double

这与@MartinR's answer非常相似,只是这是纯粹的Swift并且不需要 Foundation 框架。

答案 2 :(得分:1)

试试这段代码:

let rows = sampleString.components(separatedBy: .newlines)
var finalArray = [[Double]]()

for row in rows {
    let array = row.components(separatedBy: .whitespaces).compactMap { Double($0) }
    finalArray.append(array)
}

print(finalArray)

如果您使用的是Swift 4.0或更低版本,请将compactMap替换为flatMap