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 works
Zdaję 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 Foo
zajmuje 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
ArrayBuffer
i jego+=
metody? To da ci zamortyzowany O (1) dodatek.System.arraycopy(...)
zostaje zastąpiony przezArray.copy(...)
ArrayBuffer
który jest konwertowany po ostatnim dołączeniu do tablicy (ztoArray
)?Odpowiedzi:
Możesz użyć,
:+
aby dołączyć element do tablicy i+:
poprzedzić go:powinien produkować:
Działa tak samo, jak w przypadku każdej innej implementacji
Seq
.źródło
Array.copy(repr, 0, result, 0, repr.length)
Działa również „odwrócony”:
Dostępna jest również wersja „lokalna”:
źródło
Najłatwiej byłoby:
W rzeczywistości Array można implcitly przekształcić w plik
WrappedArray
źródło