Powiedz, że Array[Int]lubię
val array = Array( 1, 2, 3 )
Teraz chciałbym dołączyć element do tablicy, powiedzmy wartość 4, jak w poniższym przykładzie:
val array2 = array + 4 // will not compile
Mogę oczywiście używać System.arraycopy()i robić to samodzielnie, ale musi być do tego funkcja biblioteki Scala, której po prostu nie mogłem znaleźć. Dzięki za wskazówki!
Uwagi:
Zdaję sobie sprawę, że mogę dołączyć kolejną tablicę elementów, jak w poniższym wierszu, ale wydaje się to zbyt okrągłe:
val array2b = array ++ Array( 4 ) // this worksZdaję sobie sprawę z zalet i wad List vs Array i tutaj jestem z różnych powodów szczególnie zainteresowany rozszerzeniem Array.
Edytuj 1
Dzięki za odpowiedzi wskazujące na :+metodę operatorską. To jest to, czego szukałem. Niestety jest to raczej wolniejsze niż implementacja niestandardowej metody append () arraycopy- około dwa do trzech razy wolniejsza. Patrząc na implementację w programie SeqLike[], tworzony jest konstruktor, następnie tablica jest do niej dodawana, a następnie dodawane jest za pośrednictwem konstruktora, a następnie renderowany jest konstruktor. Niezbyt dobra implementacja dla tablic. Zrobiłem szybki test porównawczy, porównując dwie metody, patrząc na najszybszy czas z dziesięciu cykli. Wykonanie 10 milionów powtórzeń pojedynczego elementu dołączanego do 8-elementowej instancji tablicy pewnej klasy Foozajmuje 3,1 sekundy :+zi 1,7 sekundy przy użyciu prostej append()metodySystem.arraycopy();wykonanie 10 milionów powtórzeń dopisywania pojedynczych pozycji na 8-elementowych tablicach Long zajmuje 2,1 sekundy z :+prostą append()metodą i 0,78 sekundy . Zastanawiasz się, czy nie można tego naprawić w bibliotece za pomocą niestandardowej implementacji Array?
Edytuj 2
Za to, co jest warte, złożyłem bilet: https://issues.scala-lang.org/browse/SI-5017
System.arraycopy(...)zostaje zastąpiony przezArray.copy(...)
ArrayBufferktóry jest konwertowany po ostatnim dołączeniu do tablicy (z toArray)?
ArrayBufferi jego+=metody? To da ci zamortyzowany O (1) dodatek.