2017-03-16 4 views
0

Wie kann ich durch ein Array iterieren und seine val zuweisen? Ich habe versucht, die folgenden zwei Ansätze, aber sie hat nicht funktioniert:Iteration durch Array mit Bedingung zum Erstellen eines neuen Arrays

var a : Array[String] = Array("foo","bar") 
var b : Array[String] = Array() 
for (i <- 0 to (a.length-1)) { 
    println(a(i)) 
    b :+ a(i) 
} 

und

var a : Array[String] = Array("foo","bar") 
var b : Array[String] = Array() 
for (element <- a){ 
    println(element) 
    b :+ element 
} 

So sind die println funktioniert, aber sie Zuordnung nicht.

Ich bin wirklich frustriert, da es so einfach scheint und ich merke es. :(

+0

Versuchen Sie b = b ++ Element – BioGenX

+0

Das funktioniert leider nicht. –

Antwort

3

Lassen Sie die Standardbibliothek den Kopiervorgang für Sie ausführen

val a : Array[String] = Array("foo","bar") 
val b : Array[String] = a.clone() 

Der Grund, warum Ihr Code nicht funktioniert, ist, weil :+ kein Zuweisungsoperator ist. Diese Anweisung, zum Beispiel Array() :+ "str", ändert nicht die Array, es erstellt eine neue Array mit dem geänderten Wert. Leider weist Ihr Code diese neue Array einer neuen oder vorhandenen Variablen nicht zu, so dass die Änderung verloren geht.

Sie so etwas tun könnte ...

for (element <- a){ 
    b = b :+ element 
} 

... aber es gibt bessere Möglichkeiten, dies zu tun bekommen.

Update

Um Textelemente für mehrere unabhängige Eigenschaften filtern Sie dies versuchen könnten.

val acceptableRE = "(f.*|ba.*)".r 
val a: Array[String] = Array("foo", "bar", "buf", "bba") 
val b: Array[String] = a.collect{case acceptableRE(s) => s} // Array(foo, bar) 
+0

Danke für die Antwort. Das macht Sinn. Eigentlich möchte ich es nicht klonen, sondern einige Fälle später anwenden, um einige Werte des Arrays zu eliminieren. Also ich benutze diese for-Schleife. Oder was können Sie vorschlagen, um das besser zu machen? –

+0

Also soll 'b' eine Kopie von 'a' sein, aber mit einigen Werten entfernt? Wenn das der Fall ist, dann gehen Sie mit dem Vorschlag von Jyothi Babu Araja und verwenden 'filter' (oder' filterNot', abhängig von der zu testenden Bedingung). – jwvh

+0

Das würde bedeuten, dass ich für jeden Schritt einen eigenen Filter habe? Wie 'val b = a.filter (el => el.startsWith (" f ")). Filter (el => el.startsWith (" ba "))' ?? –

2

Sie können von .filter von Array machen mit Bedingung filtern

dieses Beispiel mit Elementlänge als Bedingung

val a : Array[String] = Array("foo","bars") 
val b = a.filter(el => el.length > 3) 

. Hinweis:. Bessere Nutzung val zu Veränderlichkeit vermeiden

Verwandte Themen