Esto es más una cuestión de estilo y preferencia, pero aquí va: ¿cuándo debería usar scala.Array? Utilizo List todo el tiempo y de vez en cuando me meto en Seq, Map y similares, pero nunca he usado ni visto Array en la naturaleza. ¿Está ahí solo para la compatibilidad de Java? ¿Me estoy perdiendo un caso de uso común?¿Cuándo debería usar Scala's Array en lugar de una de las otras colecciones?
Respuesta
Antes que nada, hagamos un descargo de responsabilidad aquí. El Array
de Scala 2.7 intenta ser Java Array
y una colección de Scala al mismo tiempo. En su mayoría tiene éxito, pero falla en ambos casos de esquina. Desafortunadamente, estos casos de esquina pueden sucederle a personas buenas con código normal, por lo que Scala 2.8 se está alejando de eso.
En Scala 2.8, hay Array
, que es Java Array
. Eso significa que es un espacio de memoria contiguo, que almacena referencias o primitivas (y, por lo tanto, puede tener diferentes tamaños de elemento), y se puede acceder aleatoriamente bastante rápido. También tiene métodos pésimos, una implementación horrible toString
, y funciona mal al usar genéricos y primitivos al mismo tiempo (p. Ej .: def f[T](a: Array[T]) = ...; f(Array(1,2,3))
).
Y, entonces, está GenericArray
, que es una colección de Scala respaldada por Array
. Siempre almacena primitivas en caja, por lo que no tiene los problemas de rendimiento al mezclar primitivas y genéricos, pero, por otro lado, no tiene las ganancias de rendimiento de una matriz primitiva puramente primitiva (no genérica).
Entonces, ¿cuándo usar qué? Un Array
tiene las siguientes características:
- O (1) de lectura aleatoria y escribir
- O (n) Agregar/Preagregar/insertar/borrar
- mutable
Si no lo hace necesita genéricos, o sus genéricos pueden declararse como [T <: AnyRef]
, excluyendo así las primitivas, que son AnyVal
, y esas características son óptimas para su código, luego continúe.
Si necesita genéricos, incluidas las primitivas, y esas características son óptimas para su código, use GenericArray
en Scala 2.8. Además, si desea una Colección verdadera, con todos sus métodos, puede usarla también, en lugar de depender de las conversiones implícitas.
Si desea inmutabilidad o si necesita un buen rendimiento para agregar, anteponer, insertar o eliminar, busque otra colección.
Gracias, Daniel, esta es una gran respuesta. – pr1001
Una matriz es adecuada cuando tiene una cantidad de elementos de la misma clase (o compatible), y sabe de antemano el recuento exacto de esos elementos, o un límite superior razonable, y está interesado en el al azar rápido acceso y tal vez alteración en el lugar de los elementos, pero después de configurarlo, nunca jamás insertar o eliminar elementos de algún lugar de la lista.
O dicho de otra manera, es una estructura de datos agregados con menos campanas y silbidos que los tipos de Colección, con un poco menos de sobrecarga y un rendimiento ligeramente mejor dependiendo de cómo se usa.
Un ejemplo muy elaborado: usted está en el negocio de producir funciones, y las pruebas de calidad para estas funciones implican comprobar su rendimiento o resultados para un conjunto de 1000 valores de entrada fijos. Además, decide no guardar estos valores en un archivo, sino que los codifica en su programa. Una matriz sería apropiada.
La interfaz con las API de Java es un caso. Además, a diferencia de las matrices Java, las matrices scala son invariables y, por lo tanto, no tienen ninguna ventaja sobre las listas debido a eso.
- 1. ¿Cuándo debería usar una estructura en lugar de una clase?
- 2. ¿Cuándo debería usar un campo en lugar de una propiedad?
- 3. ¿Cuándo debería usar NSURL en lugar de NSString y viceversa?
- 4. ¿Cuándo debería usar __forceinline en lugar de inline?
- 5. ¿Cuándo debería usar string en lugar de stringstream?
- 6. ¿Cuándo debería usar el doble en lugar del decimal?
- 7. ¿Cuándo debería usar stdClass y cuándo debería usar una matriz en php oo?
- 8. SPL vs. Array: ¿Cuándo deberíamos usar SPL y cuándo debemos usar Array en PHP?
- 9. ¿Cuándo debería usar CompiledQuery?
- 10. ¿Cuándo debería usar # en ColdFusion?
- 11. Cuándo usar atributos en lugar de propiedades?
- 12. ¿Cuándo debería usar ConcurrentSkipListMap?
- 13. ¿Cuándo debería usar _aligned_malloc()?
- 14. ¿Cuándo debería usar paréntesis en las instrucciones require/include?
- 15. ¿Cuándo debería usar semáforos?
- 16. ¿Cuándo debería usar GC.SuppressFinalize()?
- 17. Cuándo debería usar SynchronousQueue
- 18. ¿Cuándo debería usar el patrón singleton en lugar de una clase estática?
- 19. ¿Cuándo debería usar ComponentResourceKey en lugar de una cadena como clave de recursos?
- 20. ¿Cuándo y por qué debería usar una ruta de acceso nombrada en lugar de un diccionario?
- 21. ¿Cuándo debería usar AUTOLOAD de Perl? En
- 22. En Objective-C, ¿cuándo debería usar métodos de clase y cuándo debería usar métodos de instancia?
- 23. ¿Cuándo debería una persona usar consultas nativas con JPA 2.0 en lugar de JPQL o CriteriaBuilder?
- 24. ¿Qué son vistas para colecciones y cuándo las quieres usar?
- 25. Cuándo usar ImageButton en lugar de ImageView?
- 26. ¿Cuándo debería usar std_logic_vector y cuándo debería usar otros tipos de datos?
- 27. ¿Cuándo debería usar un gestor de scripts?
- 28. ¿Cuándo usar 'función' en lugar de 'diversión'?
- 29. ¿Qué es phtml, y cuándo debería usar una extensión .phtml en lugar de .php?
- 30. ¿Cuándo debería usar html5 sessionStorage?
¿Debo hacer esto una wiki comunitaria? – pr1001
No lo creo. Los pros y los contras del uso de Scala's Array están bastante bien definidos, y pueden discutirse objetivamente. La pregunta es buena, en mi humilde opinión. –