2016-06-28 10 views
3

Ich habe eine Reihe von Doppel-Array. Wie wandelst du das in eine einzelne Zeichenfolge um, die auf der Konsole gedruckt wird?Wie man ein Array aus einem Array von Doppel in String verwandelt, Swift

Ich muss eine Funktion erstellen, die ein Array von Doppelfeldern als Parameter akzeptiert und ein String-Objekt zurückgibt. Durchlaufen Sie dann jedes der inneren Arrays und verketten Sie jedes Element der inneren Arrays zu einem String-Objekt. Aber ich bin mir nicht sicher, wie ich das anstellen soll.

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] 

Dies ist der Code, den ich habe ... aber ich weiß nicht, wie eine for-Schleife zu tun, die mir meine Antwort geben würde ...

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

    (for loop here...) 

    return stringVar 
} 

print(nestedArrayFunction(nestedArray)) 

Die erwartete Ausgabe a sein sollte String-Objekt, ohne Klammern

+1

Können Sie uns bitte die erwartete Ausgabe zeigen? –

+0

Ja, ich bin auch verwirrt. Ich muss eine Funktion erstellen, die ein Array von Double-Arrays als Parameter akzeptiert und ein String-Objekt zurückgibt. Durchlaufen Sie dann jedes der inneren Arrays und verketten Sie jedes Element der inneren Arrays zu einem String-Objekt. Aber ich bin mir nicht sicher, wie ich das anstellen soll. – art3mis

+0

ok danke :) – art3mis

Antwort

0

Aus der Beschreibung in Ihrer Frage, wie es scheint, wenn das Argument von nestedFunction(...) sollte ein Array von Arrays mit Doppel bewerteten Elemente ([[Double]]) eher als ein Array mit Doppel bewerteten Elemente ([Double]) sein.

Sie können .flatten() zu Ihrem einfach verschachtelten Array nestedArray in nestedFunction(...) verwenden und danach z. reduce, um die Double Wertelemente des abgeflachten Arrays zu einem konzentrierten String zu transformieren.

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" 

Als Alternative, wenn Sie sich mit einer for Schleife gesetzt sind, können Sie auf dem abgeflachten for ... in Array verwendet werden, zB:

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" 

zu beachten, dass aufgrund der begrenzten Gleitkommagenauigkeit, einige doppelte Werte können mit einer "unordentlichen" String Darstellung enden (zB 2.6 könnte enden als 2.6000000000000001), wenn der direkte String Initialisierer (String($1) und String(elem) oben, in der ersten bzw. zweiten Methode) verwendet wird. Zum Einlösen diesen Sie eine feste Anzahl von Bruchstellen für die String Darstellung Ihrer Double Werte einstellen könnten, mit dem folgenden String initializer:

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

ZB ersetzen String($1) und String(elem) in den Verfahren, die oben durch String(format: "%.3f", $1) und String(format: "%.3f", elem) bzw. , für eine bestimmte Anzahl von Bruchzahlen Ihrer Wahl. Die Double Werte werden auf die Anzahl der gelieferten Bruchzahlen gerundet.

+0

es funktioniert ... danke :) – art3mis

+0

@VeronicaG glücklich zu helfen! – dfri

0

Array CustomStringConvertible entspricht, so kann man einfach seine description Eigenschaft:

nestedArray.description 

output:

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

Dies ist, was die reguläre print-Funktion verwendet, um solche Arrays zu drucken.

0

Zuerst müssen Sie die Arrays, die Sie haben, verketten oder kombinieren. Sie können das einfach tun, indem Sie ein anderes Array wie dieses erstellen;

let fullArray = array1 + array2 + array3 

Als nächstes können Sie die volle Palette drucken,

print(fullArray) 

Was Sie so etwas wie

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

geben würde, oder Sie können eine Stringdarstellung dieses Array erstellen, die .joinWithSeparator mit (String: String) methode, so

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

Hoffe, das hilft!


1

Wenn Sie es ohne die Klammern wollen:

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

Ausgang:

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

Kenntnis, dass sich , Verwendung als Separator nicht Lokalisierung Beweis ist, und in Französisch locale würde dazu führen, eine Schnur wie "2,6,6,7,7,2" und so weiter.

Verwandte Themen