Diga que tenho um Array[Int]
gosto
val array = Array( 1, 2, 3 )
Agora, gostaria de acrescentar um elemento à matriz, digamos o valor 4
, como no exemplo a seguir:
val array2 = array + 4 // will not compile
Claro que posso usar System.arraycopy()
e fazer isso sozinho, mas deve haver uma função de biblioteca Scala para isso, que simplesmente não consegui encontrar. Obrigado por quaisquer dicas!
Notas:
Estou ciente de que posso acrescentar outro Array de elementos, como na linha a seguir, mas isso parece muito genérico:
val array2b = array ++ Array( 4 ) // this works
Estou ciente das vantagens e desvantagens de List vs Array e aqui estou, por vários motivos, especificamente interessado em estender um Array.
Editar 1
Obrigado pelas respostas apontando para o :+
método do operador. Isso é o que eu estava procurando. Infelizmente, é um pouco mais lento do que a implementação de um método append () personalizado usando arraycopy
- cerca de duas a três vezes mais lento. Observando a implementação em SeqLike[]
, um construtor é criado, a matriz é incluída nele, a anexação é feita por meio do construtor e, em seguida, o construtor é renderizado. Não é uma boa implementação para arrays. Fiz um benchmark rápido comparando os dois métodos, observando o tempo mais rápido entre dez ciclos. Fazer 10 milhões de repetições de um único item anexado a uma instância de matriz de 8 elementos de alguma classe Foo
leva 3,1 segundos :+
e 1,7 segundos com um append()
método simples que usaSystem.arraycopy();
fazer 10 milhões de repetições de acréscimo de item único em arrays de 8 elementos de Long leva 2,1 segundos :+
e 0,78 segundos com o append()
método simples . Gostaria de saber se isso não poderia ser corrigido na biblioteca com uma implementação personalizada para Array
?
Editar 2
Para valer a pena, preenchi um tíquete: https://issues.scala-lang.org/browse/SI-5017
System.arraycopy(...)
é substituído porArray.copy(...)
ArrayBuffer
que é convertido após o último acréscimo em um array (com toArray
)?
ArrayBuffer
e seu+=
método? Isso lhe dará o anexo O (1) amortizado.