Jestem całkowicie nowy w scali i nie rozumiemdlaczego ta lista nie wychodzi poprawnie. Kiedy uruchamiam program, po prostu otrzymuję List () jako wyjście, gdy powinienem otrzymać listę wszystkich elementów do kwadratu, co powinno być bardzo proste, ale operacja: + jest co znalazłem online i nie działa.
def Squareall (l: List[Int]): List[Int] ={
var r : List[Int]=List()
for (i<-0 to l.length-1){
r:+ l(i)*l(i)
}
return r
}
Odpowiedzi:
3 dla odpowiedzi № 1Musisz przypisać nowo utworzoną listę do r
lubię to:
r = r:+ l(i)*l(i)
To dlatego, że domyślnie List
w Scali jest niezmienny i :+
zwraca nową listę, nie aktualizuje starej.
Oczywiście istnieje również zmienna odmiana listy scala.collection.mutable.MutableList
. Możesz użyć .++=
metoda na to, aby rozwijać kolekcję.
val mutableList = scala.collection.mutable.MutableList(1, 2)
mutableList.++=(List(3, 4))
7 dla odpowiedzi nr 2
W Scali unika się imperatywnego stylu kodowania, którego używasz w swoim przykładzie. The for
w Scali jest wyrażeniem, co oznacza, że daje wartość, a zatem można bezpośrednio przekształcić listę wejściową. Aby użyć for
przekształcić dane wejściowe List
możesz zrobić coś takiego:
def squareAll (l: List[Int]): List[Int] = {
for (i <- l) yield i * i
}
Jeśli nie dostarczysz yield
oświadczenie a for
wyniki w Unit
typ, który jest podobny void
w Javie. Ten smak for
pętla jest generalnie do produkcji skutki uboczne, jak drukowanie na ekranie lub pisanie do pliku. Jeśli naprawdę chcesz tylko przekształcić dane, nie ma potrzeby tworzenia i manipulowania nimi List
. (Również nazwy metod w Scali są na ogół „wielbłądzie”.)
Większość ludzi prawdopodobnie użyje List.map
metoda zamiast tego:
def squareAll (l: List[Int]) = l.map((x: Int) => x * x)
lub nawet...
def squareAll (l: List[Int]) = l.map(Math.pow(_, 2.0))