2015-03-03 2 views
6

Ich versuche, ein FoldLeft auf einem Array zu verwenden. ZB:Verwenden Sie ein Array als Scala foldLeft Akkumulator

var x = some array 
x.foldLeft(new Array[Int](10))((a, c) => a(c) = a(c)+1) 

Das weigert sich, mit dem Fehler zu kompilieren Int (0) benötigt Array [Int].

+0

ist Ihnen bewusst, dass 'eine Berechnung 'zu einem' Array [Int] 'ausgewertet werden muss und dass' neues Array [Int] (10) 'ein Array von 10 Elementen erzeugt? Es wäre hilfreich, wenn Sie den Rest des Codes zeigen. Oder zumindest die Absicht. – ale64bit

+0

Der Code wurde hinzugefügt. – user1742188

+1

'a (c) = a (c) + 1' hat den Typ' Unit', während Sie 'Array [Int]' brauchen. Was genau möchten Sie mit Ihrem Code erreichen? – ale64bit

Antwort

5

Um foldLeft in zu verwenden, was Sie tun wollen, und nach Ihrem Stil, können Sie einfach die Rückkehr gleiche Akkumulatorarray in der Berechnung wie folgt aus:

val ret = a.foldLeft(new Array[Int](10)) { 
     (acc, c) => acc(c) += 1; acc 
    } 

Alternativ kann, da Ihre Zahlen von 0 bis 9 sind, können Sie dies auch das gleiche Ergebnis zu erzielen:

012.311.
2

Die Zuweisung in Scala liefert keinen Wert (sondern Unit), so dass Ihr Ausdruck, der das Array [Int] für den nächsten Schritt zurückgeben soll, die Einheit zurückgibt, die nicht funktioniert.

Sie müßten einen Block verwenden und das Feld am Ende wie folgt zurück:

x.foldLeft(new Array[Int](10)) { (a, c) => 
    a(c) = a(c)+1 
    a 
} 
+0

eine offensichtliche Klarstellung ist, dass, wenn Sie das Ergebnis von 'foldLeft' nicht etwas zuweisen, es verloren gehen wird. Aber nur für den Fall. – ale64bit

Verwandte Themen