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):
Sintaxis:
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:
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.
int a2= new int[20]; // error en compilación!
String[ ] b2= new int[10]; // error en compilación!
Cambiar el valor de un elemento en un arreglo:
Sintaxis:
en donde exp-arreglo corresponde típicamente a una variable que referencia un arreglo.
Ejemplos:
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.
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!
Inicialización de los elementos de un arreglo (de strings):
Obtener el valor de un elemento en un arreglo:
int i=0;
while (i<10) {
b[i]= "";
i= i+1;
}
Sintaxis:
Ejemplo:
int x= a[0];
int i= 0;
while (i<20) {
println(a[i]);
i= i+1;
}
(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''.
Ejercicio 2: Escribir un trozo de código que dado el nombre
de un alumno entregue su nota.
// 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 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.
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");
}
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.
(Ver el programa completo en Frec.java.)
// 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]);