Arreglos Nativos

Los arreglos de la clase Array no son nativos de Java, es decir no vienen incluidos en forma estándar en el lenguaje. La clase Array ha sido introducida en este curso como una forma de facilitar el aprendizaje de los arreglos en general. Pero esta clase ha sido definida (implementada) en términos de otros objetos que sí son nativos en Java.

Java ofrece a los programadores arreglos nativos, es decir que vienen integrados al lenguaje Java. La ventaja de estos arreglos es doble: (i) son más eficientes que los de la clase Array, y (ii) se manipulan más cómodamente gracias a reglas sintácticas especiales que ofrece Java. Las siguientes son las caraterísticas de los arreglos nativos (que los diferencian de los arreglos de la clase Array):

Construcción:

Sintaxis:

tipo[ ] var= new tipo[ tamaño ];

Ejemplo 1: int[ ] a= new int[20];

Construye un arreglo a de 20 enteros. Los índices están en el rango [0,19]. Los valores almacenados en el arreglo serán enteros (inicialmente todos en 0).

Ejemplo 2: String[ ] b= new String[10]

Construye un arreglo b de 10 strings. Los índices están en el rango [0,9]. Los valores almacenados en el arreglo serán strings (no inicializados).

Ejemplos incorrectos:

    int a2= new int[20]; // error en compilación!
    String[ ] b2= new int[10]; // error en compilación!
La primera instrucción es incorrecta porque el tipo de la expresión que aparece al lado derecho de = es arreglo de enteros, pero a2 la variable asignada es de tipo entero (y no arreglo de enteros). En la segunda instrucción b2 es tipo arreglo, pero no de enteros si no que de strings, por lo que esta instrucción también está incorrecta.

Cambiar el valor de un elemento en un arreglo:

Sintaxis:

exp-arreglo [ exp-índice ] = exp-valor;

en donde exp-arreglo corresponde típicamente a una variable que referencia un arreglo.

Ejemplos:

    a[0]= 5;
    a[1]= 10;
    a[i]= 20;
    a[20]= 0; // error en tiempo de ejecución!
    a[3]= "hola"; // error en compilación!
El primer error se debe a que el índice está fuera del rango válido para el arreglo a. El segundo se debe a que el tipo del valor asignado no es entero.

Inicialización de los elementos de un arreglo (de strings):

    int i=0;
    while (i<10) {
      b[i]= "";
      i= i+1;
    }
Obtener el valor de un elemento en un arreglo:

Sintaxis:

exp-arreglo [ exp-índice ]

Ejemplo:

    int x= a[0];
    int i= 0;
    while (i<20) {
      println(a[i]);
      i= i+1;
    }

Uso de arreglos nativos

Todos los programas que hemos visto hasta ahora y que usan la clase Array se pueden transformar trivialmente de modo que utilicen arreglos nativos de Java. La siguiente es una receta para transformarlos en programas que usan arreglos nativos. Por simplicidad consideraremos un programa que usa sólo un arreglo, además el tipo de los valores es siempre de tipo String (podría ser también entero, real o boolean).

(En realidad los arreglos de la clase Array permiten mezclar valores de distinto tipo. Sin embargo, no vimos ningún ejemplo que usara esta propiedad de la clase Array.)

Haga las siguientes transformaciones en el programa:

Con la clase Array Con arreglos nativos
Array tab= new Array(n) String[ ] tab= new String[n];
tab.put(i,v); tab[i]= v;
... tab.getString(i) ... ... tab[i] ...


Ejercicio 1: Construir 2 arreglos con los nombres y las notas obtenidas del archivo ``notas.txt''.

    // Creación de arreglos
    String[] tabNombres= new String[1000];
    double[] tabNotas= new double[1000];
    // Inicialización de los arreglos
    TextReader lect= new TextReader("notas.txt");
    int i= 0;
    while (true) {
      String lin= lect.readLine();
      if (lect.eofReached()) // Patrón de lectura de datos
        break;
      tabNombres[i]= trim(substring(lin, 0, 20));
      tabNotas[i]= parseDouble(trim(substring(lin, 20, 3)));
      i= i+1; // Patrón de conteo para el nro. de línea
    }
    lect.close();
    int nalum= i;
Ejercicio 2: Escribir un trozo de código que dado el nombre de un alumno entregue su nota.

    String nombre= ...; // El nombre buscado
    // Patrón de búsqueda en un arreglo
    i=0;
    while (i<nalum && compare(tabNombres[i], nombre)!=0) {
        i= i+1;
    }
    if (i<n) {
      println("Su nota es "+tabNotas[i]);
    }
    else {
      println("No se encontro este alumno");
    }
Ejercicio 3: Desplegar en pantallas el número de alumnos con nota entre 1.0 y 1.9, 2.0 y 2.9, ..., 6.0 y 6.9, 7.0.

Solución: La idea es que si se calcula la parte entera de cada nota se obtendrán los enteros 1, 2, ..., 6 o 7. Entonces ese entero se puede usar como índice en un arreglo de 8 elementos en donde se contará cuantas notas hay en cada intervalo.

    // Construcción del arreglo
    int[] frec= new int[8];
    // Inicialización del arreglo
    i= 0;
    while (i<8) {
      frec[i]= 0;
      i= i+1;
    }
    // Conteo de notas por intervalo
    i= 0;
    while (i<nalum) {
      int intervalo= trunc(tabNotas[i]);
      frec[intervalo]= frec[intervalo]+1;
      i= i+1;
    }
    // Despliegue de los resultados
    int k= 1; // Para barrer los intervalos
    while (k<7) {
      print("Entre "+k+" y "+(k+0.9)+" : "+frec[k]);
      k= k+1;
    }
    print("Con nota 7.0 : "+frec[7]);
(Ver el programa completo en Frec.java.)