Мне нужно прочитать строку, приведенную ниже, чтобы у меня были массивы двойников из этой строки, разделенные строками, поэтому каждая строка будет отдельным массивом двойников.
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)
}
}
}
Извините, это слишком долго, но я хотел показать все, что пробовал, но не мог разобраться самостоятельно
Попробуйте этот код:
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
.
Ты можешь использовать
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) }
Большое спасибо! Извините, я пока не могу поставить +1 из-за моей репутации, поэтому я хотел поблагодарить вас здесь :)
@vacawama: Вы правы, это тоже работает (потому что Double.init
принимает аргумент типа SubSequence
). И для этого не требуется фреймворк Foundation.
@vacawama: Вы хотите опубликовать это в качестве ответа?
@MartinR, я сомневался в том, достаточно ли отличается мой ответ, и решил, что это стоит отдельного поста.
Вы можете выполнить это в одной строке, используя split
для разделения строки на строки, map
для обработки каждой строки, снова split
для разделения каждой строки на отдельные строки и compactMap
с Double.init
для преобразования элементов в Double
:
let pyramid = sampleString.split(separator: "\n").map { $0.split(separator: " ").compactMap(Double.init) }
Это очень похоже на @ Ответ Мартина, за исключением того, что это чистый Swift и исключает необходимость в структуре фундамент.
Большое спасибо! Извините, я пока не могу поставить +1 из-за моей репутации, поэтому я хотел поблагодарить вас здесь :)