Scala: matrices

Scala proporciona una estructura de datos, la array, que almacena una colección secuencial de tamaño fijo de elementos del mismo tipo. Una matriz se utiliza para almacenar una colección de datos, pero a menudo es más útil pensar en una matriz como una colección de variables del mismo tipo.

En lugar de declarar variables individuales, como número0, número1, ... y número99, declaras una variable de matriz como números y usas números [0], números [1] y ..., números [99] para representar variables individuales. Este tutorial presenta cómo declarar variables de matriz, crear matrices y procesar matrices utilizando variables indexadas. El índice del primer elemento de una matriz es el número cero y el índice del último elemento es el número total de elementos menos uno.

Declaración de variables de matriz

Para usar una matriz en un programa, debe declarar una variable para hacer referencia a la matriz y debe especificar el tipo de matriz a la que la variable puede hacer referencia.

La siguiente es la sintaxis para declarar una variable de matriz.

Sintaxis

var z:Array[String] = new Array[String](3)

or

var z = new Array[String](3)

Aquí, z se declara como una matriz de cadenas que pueden contener hasta tres elementos. Los valores se pueden asignar a elementos individuales u obtener acceso a elementos individuales, se puede hacer usando comandos como los siguientes:

Mando

z(0) = "Zara"; z(1) = "Nuha"; z(4/2) = "Ayan"

Aquí, el último ejemplo muestra que, en general, el índice puede ser cualquier expresión que arroje un número entero. Hay una forma más de definir una matriz:

var z = Array("Zara", "Nuha", "Ayan")

La siguiente imagen representa una matriz myList. Aquí,myList contiene diez valores dobles y los índices van de 0 a 9.

Procesamiento de matrices

Cuando procesamos elementos de matriz, a menudo usamos estructuras de control de bucle porque todos los elementos de una matriz son del mismo tipo y se conoce el tamaño de la matriz.

A continuación se muestra un programa de ejemplo que muestra cómo crear, inicializar y procesar matrices:

Ejemplo

object Demo {
   def main(args: Array[String]) {
      var myList = Array(1.9, 2.9, 3.4, 3.5)
      
      // Print all the array elements
      for ( x <- myList ) {
         println( x )
      }

      // Summing all elements
      var total = 0.0;
      
      for ( i <- 0 to (myList.length - 1)) {
         total += myList(i);
      }
      println("Total is " + total);

      // Finding the largest element
      var max = myList(0);
      
      for ( i <- 1 to (myList.length - 1) ) {
         if (myList(i) > max) max = myList(i);
      }
      
      println("Max is " + max);
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

\>scalac Demo.scala
\>scala Demo

Salida

1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5

Scala no admite directamente varias operaciones de matrices y proporciona varios métodos para procesar matrices en cualquier dimensión. Si desea utilizar los diferentes métodos, es necesario importarArray._ paquete.

Matrices multidimensionales

Hay muchas situaciones en las que necesitaría definir y utilizar matrices multidimensionales (es decir, matrices cuyos elementos son matrices). Por ejemplo, las matrices y tablas son ejemplos de estructuras que pueden realizarse como matrices bidimensionales.

El siguiente es el ejemplo de definición de una matriz bidimensional:

var myMatrix = ofDim[Int](3,3)

Esta es una matriz que tiene tres elementos, cada uno de los cuales es una matriz de números enteros que tiene tres elementos.

Pruebe el siguiente programa de ejemplo para procesar una matriz multidimensional:

Ejemplo

import Array._

object Demo {
   def main(args: Array[String]) {
      var myMatrix = ofDim[Int](3,3)
      
      // build a matrix
      for (i <- 0 to 2) {
         for ( j <- 0 to 2) {
            myMatrix(i)(j) = j;
         }
      }
      
      // Print two dimensional array
      for (i <- 0 to 2) {
         for ( j <- 0 to 2) {
            print(" " + myMatrix(i)(j));
         }
         println();
      }
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

\>scalac Demo.scala
\>scala Demo

Salida

0 1 2
0 1 2
0 1 2

Concatenar matrices

Pruebe el siguiente ejemplo que utiliza el método concat () para concatenar dos matrices. Puede pasar más de una matriz como argumentos al método concat ().

Ejemplo

import Array._

object Demo {
   def main(args: Array[String]) {
      var myList1 = Array(1.9, 2.9, 3.4, 3.5)
      var myList2 = Array(8.9, 7.9, 0.4, 1.5)

      var myList3 =  concat( myList1, myList2)
      
      // Print all the array elements
      for ( x <- myList3 ) {
         println( x )
      }
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

\>scalac Demo.scala
\>scala Demo

Salida

1.9
2.9
3.4
3.5
8.9
7.9
0.4
1.5

Crear matriz con rango

Uso del método range () para generar una matriz que contiene una secuencia de números enteros crecientes en un rango dado. Puede utilizar el argumento final como paso para crear la secuencia; si no usa el argumento final, entonces el paso se asumirá como 1.

Tomemos un ejemplo de creación de una matriz de rango (10, 20, 2): Significa crear una matriz con elementos entre 10 y 20 y una diferencia de rango 2. Los elementos de la matriz son 10, 12, 14, 16 y 18 .

Otro ejemplo: rango (10, 20). Aquí la diferencia de rango no se da, por lo que por defecto asume 1 elemento. Crea una matriz con los elementos entre 10 y 20 con una diferencia de rango 1. Los elementos de la matriz son 10, 11, 12, 13,… y 19.

El siguiente programa de ejemplo muestra cómo crear una matriz con rangos.

Ejemplo

import Array._

object Demo {
   def main(args: Array[String]) {
      var myList1 = range(10, 20, 2)
      var myList2 = range(10,20)

      // Print all the array elements
      for ( x <- myList1 ) {
         print( " " + x )
      }
      
      println()
      for ( x <- myList2 ) {
         print( " " + x )
      }
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

\>scalac Demo.scala
\>scala Demo

Salida

10 12 14 16 18
10 11 12 13 14 15 16 17 18 19

Métodos de matriz Scala

A continuación se muestran los métodos importantes que puede utilizar mientras juega con array. Como se muestra arriba, tendría que importarArray._paquete antes de utilizar cualquiera de los métodos mencionados. Para obtener una lista completa de los métodos disponibles, consulte la documentación oficial de Scala.

No Señor Métodos con descripción
1

def apply( x: T, xs: T* ): Array[T]

Crea una matriz de objetos T, donde T puede ser Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean.

2

def concat[T]( xss: Array[T]* ): Array[T]

Concatena todas las matrices en una única matriz.

3

def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit

Copie una matriz a otra. Equivalente a System.arraycopy de Java (src, srcPos, dest, destPos, length).

4

def empty[T]: Array[T]

Devuelve una matriz de longitud 0

5

def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T]

Devuelve una matriz que contiene aplicaciones repetidas de una función a un valor inicial.

6

def fill[T]( n: Int )(elem: => T): Array[T]

Devuelve una matriz que contiene los resultados de algunos cálculos de elementos varias veces.

7

def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]]

Devuelve una matriz bidimensional que contiene los resultados de algunos cálculos de elementos varias veces.

8

def iterate[T]( start: T, len: Int)( f: (T) => T ): Array[T]

Devuelve una matriz que contiene aplicaciones repetidas de una función a un valor inicial.

9

def ofDim[T]( n1: Int ): Array[T]

Crea una matriz con las dimensiones dadas.

10

def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]

Crea una matriz bidimensional

11

def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]]

Crea una matriz tridimensional

12

def range( start: Int, end: Int, step: Int ): Array[Int]

Devuelve una matriz que contiene valores igualmente espaciados en algún intervalo de enteros.

13

def range( start: Int, end: Int ): Array[Int]

Devuelve una matriz que contiene una secuencia de números enteros crecientes en un rango.

14

def tabulate[T]( n: Int )(f: (Int)=> T): Array[T]

Devuelve una matriz que contiene valores de una función determinada en un rango de valores enteros a partir de 0.

15

def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int ) => T): Array[Array[T]]

Devuelve una matriz bidimensional que contiene valores de una función determinada en rangos de valores enteros a partir de 0.