Как преобразовать тип пирамиды String в массив двойников в Swift 4

Мне нужно прочитать строку, приведенную ниже, чтобы у меня были массивы двойников из этой строки, разделенные строками, поэтому каждая строка будет отдельным массивом двойников.

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
"""

Например: 1-й массив = [55], 2-й массив = [94, 48] и так далее.

Я знаю, что есть похожие вопросы по этому поводу, и я пробовал строковые методы, такие как: replaceOccurances (of: with :), trimmingCharacters (in :), split (seperator :) и так далее, и сначала я попробовал что-то вроде этого:

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)
            }
        }

    }

Извините, это слишком долго, но я хотел показать все, что пробовал, но не мог разобраться самостоятельно

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
3
0
224
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте этот код:

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.

Большое спасибо! Извините, я пока не могу поставить +1 из-за моей репутации, поэтому я хотел поблагодарить вас здесь :)

emrepun 02.05.2018 14:14
Ответ принят как подходящий

Ты можешь использовать

  • 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]]

Я сделал то же самое, используя split: let pyr = sampleString.split(separator: "\n").map { $0.split(separator: " ").compactMap(Double.init) }

vacawama 02.05.2018 14:12

Большое спасибо! Извините, я пока не могу поставить +1 из-за моей репутации, поэтому я хотел поблагодарить вас здесь :)

emrepun 02.05.2018 14:14

@vacawama: Вы правы, это тоже работает (потому что Double.init принимает аргумент типа SubSequence). И для этого не требуется фреймворк Foundation.

Martin R 02.05.2018 14:17

@vacawama: Вы хотите опубликовать это в качестве ответа?

Martin R 02.05.2018 14:28

@MartinR, я сомневался в том, достаточно ли отличается мой ответ, и решил, что это стоит отдельного поста.

vacawama 02.05.2018 15:18

Вы можете выполнить это в одной строке, используя split для разделения строки на строки, map для обработки каждой строки, снова split для разделения каждой строки на отдельные строки и compactMap с Double.init для преобразования элементов в Double:

let pyramid = sampleString.split(separator: "\n").map { $0.split(separator: " ").compactMap(Double.init) }

Это очень похоже на @ Ответ Мартина, за исключением того, что это чистый Swift и исключает необходимость в структуре фундамент.

Другие вопросы по теме