Temas:
Resumen clase pasada:
| tab.put(int k, int v) | Asocia el entero v con la llave k. |
| tab.put(int k, double v) | Asocia el real v con la llave k. |
| tab.put(int k, String s) | Asocia el string s con la llave k. |
| tab.put(int k, boolean b) | Asocia el booleano b con la llave k. |
| tab.getInt(int k) | Obtiene el entero asociado a la llave k. |
| tab.getDouble(int k) | Obtiene el real asociado a la llave k. |
| tab.getString(int k) | Obtiene el string asociado a la llave k. |
| tab.getBoolean(int k) | Obtiene el valor booleano asociado a la llave k. |
Los valores en un arreglo asociativo pueden ser cualesquiera entre enteros, reales, strings o booleanos. ¡Pero cuidado! Al obtener su valor, el tipo del valor asociado debe coincidir con el tipo pedido. Es decir, previamente se debe haber invocado tab.put(k, v) en donde v era del valor pedido.
Por otra parte, en un arreglo asociativo construido con Map, las llaves siempre deben ser de tipo entero. La próxima clase veremos los StringMap que son arreglos asociativos en donde las llaves son strings.
Ejercicio:
Escribir un programa que lea las líneas del archivo ``datos.txt'' y las muestre en la consola en orden inverso. Por ejemplo, si el contenido de ``datos.txt'' es:
Un arreglo asociativo o mapa es un
objeto que permite asociar valores
a números enteros o strings.
a números enteros o strings.
objeto que permite asociar valores
Un arreglo asociativo o mapa es un
Observaciones:
Map tab= new Map();
TextReader lect= new TextReader("datos.txt");
int i= 0;
while (true) {
String lin= lect.readLine();
if (lect.eofReached())
break;
i= i+1;
tab.put(i, lin);
}
lect.close();
while (i>=1) {
println(tab.getString(i));
i= i-1;
}
k= límite inferior del rango
while (k<=límite superior) {
... tab.getTipo(k) ...
}
en donde tab es un arreglo cualquiera y k es una variable entera.
k= límite superior del rango
while (k>=límite inferior) {
... tab.getTipo(k) ...
}
Ejercicio
El archivo ``notas.txt'' contiene las notas de un control en un curso de estadísticas. El formato del archivo es el siguiente:
Gloria Hernandez:6.0
Juan Perez:5.5
Jose Urrutia:5.8
etc.
Solución:
| Llave | Valor |
|---|---|
| (línea) | (nombre) |
| 1 | Gloria Hernandez |
| 2 | Juan Perez |
| 3 | Jose Urrutia |
| ... | ... |
| Llave | Valor |
|---|---|
| (línea) | (nombre) |
| 1 | 6.0 |
| 2 | 5.5 |
| 3 | 5.8 |
| ... | ... |
La idea fundamental es que se puede conocer el nombre y la nota del alumno contenido en la i-ésima línea del archivo, utilizando el i como llave en el arreglo de nombres y en el arreglo de notas respectivamente.
// Creación de arreglos
Map tabNombres= new Map();
Map tabNotas= new Map();
// Inicialización de los arreglos y cálculo
// de la mejor nota
TextReader lect= new TextReader("notas.txt");
int i= 0;
double maxNota= 0.0;
while (true) {
String lin= lect.readLine();
if (lect.eofReached()) // Patrón de lectura de datos
break;
i= i+1; // Patrón de conteo para el nro. de línea
FieldParser decod= new FieldParser(lin,":");
// Patrón de inicialización de arreglos
tabNombres.put(i, decod.readString());
double nota= decod.readDouble();
// Patrón de inicialización de arreglos
tabNotas.put(i, nota);
if (nota>maxNota)
maxNota= nota;
}
lect.close();
// i es el número de líneas leídas
// Determinar nombres de los que obtuvieron la
// mejor nota.
// Patrón de recorrido de un arreglo
int j=1;
while (j>=1) {
if (tabNotas.getInt(j)==maxNota)
println(tabNombres.getString(j));
j= j+1;
}
Tarea:
La mejor nota fue un 6.5
Los alumnos fueron:
Mariano Benitez
Adriana Gonzalez
La segunda mejor nota fue un 6.2
Los alumnos fueron:
Andres Concha
Nota Nro. de alumnos
6.5 2
6.2 1
5.9 4
...
2.6 1