/ / Jak dodać do listy? Scala - scala

Jak dodać do listy? Scala - scala

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 № 1

Musisz 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))