Miércoles 12 de Mayo

Arreglos Asociativos -- 2da. Parte

Objetivos: Presentar patrones de uso de arreglos por medio de dos ejemplos: (i) invertir las líneas de un archivo, y (ii) determinar los nombres de los alumnos que obtuvieron la mejor nota en un control, a partir de un archivo que contiene líneas con nombre y nota en el control.

Temas:


Resumen clase pasada:

Operaciones para crear o cambiar una asociación

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.

Operaciones para consultar por una asociación

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.
el programa debe mostrar en la pantalla:

    a números enteros o strings.
    objeto que permite asociar valores
    Un arreglo asociativo o mapa es un
Solución:

    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;
    }
Observaciones:


Patrones de recorrido de arreglos

Típicamente, los arreglos asociativos poseerán llaves en un rango de enteros conocidos. Por ejemplo entre 0 y n-1 o 1 y n. Para manipular estos arreglos se usan los siguientes patrones:


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.
El primer campo es el nombre del alumno y el segundo es su nota en el control. Haga un programa que lea una sola vez el archivo ``notas.txt'' y despliegue en pantalla los nombres de las personas que obtuvieron la mejor nota.

Solución:

Solución:

    // 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: