2009-11-24 4 views
8

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?

+0

¿Debo hacer esto una wiki comunitaria? – pr1001

+1

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. –

Respuesta

12

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.

+0

Gracias, Daniel, esta es una gran respuesta. – pr1001

3

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.

3

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.

Cuestiones relacionadas