2015-03-03 8 views
6

Próbuję użyć foldLeft w tablicy. Np .:Użyj tablicy jako zasobnika Scala foldLeft

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

To odmawia skompilowania z błędem znalezionym Int (0) wymagany Array [Int].

+0

Czy zdajesz sobie sprawę, że 'niektóre obliczenia' muszą być obliczone na' Array [Int] 'i że' new Array [Int] (10) 'tworzy tablicę 10 elementów? Byłoby pomocne, gdyby pokazać pozostałą część kodu. Lub przynajmniej intencję. – ale64bit

+0

Dodano kod. – user1742188

+1

'a (c) = a (c) + 1' ma typ' Unit', gdy potrzebujesz 'Array [Int]'. Co dokładnie chcesz osiągnąć za pomocą kodu? – ale64bit

Odpowiedz

5

Aby korzystać foldLeft w co chcesz zrobić, a po swój styl, można po prostu wrócić sama tablica akumulator w obliczeniach tak:

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

Alternatywnie, ponieważ numery są od 0 do 9, można też to zrobić, aby osiągnąć ten sam rezultat:

val ret = (0 to 9).map(x => a.count(_ == x)) 
2

Przypisanie w Scali nie zwraca wartości (ale zamiast jednostki), więc wyrażenie, które ma zwrócić tablicę [Int] do następnego kroku, zwraca jednostkę, która nie działa.

Trzeba by użyć blok i zwróci tablicę w końcu jak to:

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

Oczywistym wyjaśnieniem jest to, że jeśli nie przypiszesz wyniku 'foldLeft' do czegoś, to zostanie ono utracone. Ale na wszelki wypadek. – ale64bit

Powiązane problemy