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 worksEstou 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 Fooleva 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(...)
ArrayBufferque é convertido após o último acréscimo em um array (com toArray)?
ArrayBuffere seu+=método? Isso lhe dará o anexo O (1) amortizado.