2016-06-28 2 views
3

У меня есть массив из двух пар. Как преобразовать его в одну строку, напечатанную на консоли?Как превратить массив из двух пар в строку, Swift

Мне нужно создать функцию, которая принимает в массиве массивы парных чисел как параметр и возвращает строковый объект. Затем проведите через каждый из внутренних массивов и объедините каждый элемент внутренних массивов в объект String. Но я не уверен, как это сделать.

var array1 = [2.6, 6.7, 7.2, 4.1, 3.1] 
var array2 = [1.2, 3.5, 2.8, 4.5, 6.4] 
var array3 = [1.2, 1.3, 1.4, 1.5, 1.6] 

var nestedArray = [array1, array2, array3] 

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

func nestedFunction(nestedArray: [[Double]]) -> String { 
    var stringVar: String = "" 

    (for loop here...) 

    return stringVar 
} 

print(nestedArrayFunction(nestedArray)) 

Ожидаемый результат должен быть строковый объект, без скобок

+1

Не могли бы вы показать нам ожидаемый результат? –

+0

Да, я тоже смущен. Мне нужно создать функцию, которая принимает в массив массив массивов двойников как параметр и возвращает строковый объект. Затем проведите через каждый из внутренних массивов и объедините каждый элемент внутренних массивов в объект String. Но я не уверен, как это сделать. – art3mis

+0

ОК спасибо :) – art3mis

ответ

0

Из описания в вашем вопросе, кажется, как будто аргумент nestedFunction(...) должен быть массивом массивов с двойным нормированными элементами ([[Double]]), а не массива с двойным стоимостью элементами ([Double]).

Вы можете использовать .flatten() для вашего простого вложенного массива nestedArray в nestedFunction(...), а затем, например, reduce для преобразования Double значных элементов сплющенного массива в один сконцентрированный String.

var array1 = [2.6, 6.7, 7.2, 4.1, 3.1] 
var array2 = [1.2, 3.5, 2.8, 4.5, 6.4] 
var array3 = [1.2, 1.3, 1.4, 1.5, 1.6] 

var nestedArray = [array1, array2, array3] 

func nestedFunction (nestedArray: [[Double]])-> String { 
    return String(nestedArray 
     .flatten() 
     .reduce("") { $0 + ", " + String($1) } 
     .characters.dropFirst(2)) 
} 

let asString = nestedFunction(nestedArray) 
    // asString = "2.6, 6.7, 7.2, 4.1, 3.1, 1.2, 3.5, 2.8, 4.5, 6.4, 1.2, 1.3, 1.4, 1.5, 1.6" 

В качестве альтернативы, если вы установите на использовании for цикла, вы можете использовать for ... in на плоский массив, например:

var array1 = [2.6, 6.7, 7.2, 4.1, 3.1] 
var array2 = [1.2, 3.5, 2.8, 4.5, 6.4] 
var array3 = [1.2, 1.3, 1.4, 1.5, 1.6] 

var nestedArray = [array1, array2, array3] 

func nestedFunction (nestedArray: [[Double]])-> String { 
    var stringVar: String = "" 
    var isFirstElement = true 
    for elem in nestedArray.flatten() { 
     stringVar += (isFirstElement ? "" : ", ") + String(elem) 
     isFirstElement = false 
    } 
    return stringVar 
} 

let asString = nestedFunction(nestedArray) 
    // asString = "2.6, 6.7, 7.2, 4.1, 3.1, 1.2, 3.5, 2.8, 4.5, 6.4, 1.2, 1.3, 1.4, 1.5, 1.6" 

Обратите внимание, что из-за ограниченной точности с плавающей точкой, некоторые двойные значения могут заканчиваться «беспорядочным» представлением String (например, 2.6 может закончиться как 2.6000000000000001) при использовании прямого инициализатора String (String($1) и String(elem) выше, в первом и втором методах соответственно). Для того, чтобы выкупить это можно установить фиксированное количество знаков после запятой для String представления ваших Double значений, используя следующую String инициализатору:

String(format: "%.3f", myDoubleValue) 
    /*    \ 
      number of fraction digits (3 here) */ 

например, заменить String($1) и String(elem) в методах выше по String(format: "%.3f", $1) и String(format: "%.3f", elem), соответственно , для некоторого количества цифр по вашему выбору. Значения Double будут округлены до количества введенных цифр фракции.

+0

это работает ... спасибо :) – art3mis

+0

@VeronicaG рада помочь! – dfri

0

Массив сООТВЕТСТВУЕТ CustomStringConvertible, так что вы можете просто использовать его description свойство:

nestedArray.description 

выход:

[[2,6000000000000001, +6,7000000000000002, +7,2000000000000002, +4,0999999999999996, 3,1000000000000001], [1.2, 3.5, +2,7999999999999998, 4.5, 6,4000000000000004], [1.2, 1.3, +1,3999999999999999, 1.5, 1,6000000000000001]]

Это то, что использует регулярная функция print для печати таких массивов.

0

Прежде всего, вам необходимо объединить или объединить массивы, которые у вас есть. Вы можете сделать это просто, создав еще один массив, например:

let fullArray = array1 + array2 + array3 

Далее, вы можете распечатать полный массив,

print(fullArray) 

который даст вам что-то вроде

[2.6000000000000001, 6.7000000000000002, 7.2000000000000002, 4.0999999999999996, 3.1000000000000001, 1.2, 3.5, 2.7999999999999998, 4.5, 6.4000000000000004] 

или вы можете создать строковое представление этого массива с помощью .joinWithSeparator (String: String), например

let stringRepresentation = fullArray.joinWithSeparator(",") 
print(stringRepresentation) 

Надеюсь, это поможет!


1

Если вы хотите без скобок:

let string = nestedArray.flatMap { (array) in 
    array.flatMap { String($0) }.joinWithSeparator(",") 
}.joinWithSeparator(",") 

Выход:

"2.6,6.7,7.2,4.1,3.1,1.2,3.5,2.8,4.5,6.4,1.2,1.3,1.4,1.5,1.6" 

виду, что использование , в качестве разделителя не локализации доказательств, а во французской местности приведет к строка типа «2,6,6,7,7,2» и т. д.

Смежные вопросы