Lunes 10 de Mayo

Arreglos Asociativos

Objetivos: Presentar los arreglos asociativos como objetos útiles para manejar datos.

Temas:


Arreglos Asociativos con valores enteros

Un arreglo asociativo o mapa es un objeto que permite asociar valores a números enteros o strings. Para entender este concepto, es conveniente visualizar un arreglo asociativo como una tabla con dos columnas:

Llave Valor
1 4
2 15
3 0
4 10
5 22
6 0
7 1
8 0

La columna de la izquierda contiene las llaves (keys) y la columna de la derecha el valor asociado a cada llave. El ejemplo de más arriba podría ser la cantidad de votos captados por cada candidato. El número del candidato corresponde a la llave y la cantidad de votos es el valor asociado.

Los arreglos asociativos son objetos que realizan principales dos operaciones: (i) obtener el valor asociado a una llave, y (ii) cambiar el valor asociado a una llave. Con estas operaciones es sencillo resolver el problema del recuento de los votos:

  TextReader lect= new TextReader("votos.txt");

  Map tab= new Map(); // Crea un arreglo asociativo

  // Crear las filas del arreglo asociativo
  // El valor inicial asociado a cada candidato es 0
  int cand= 1;
  while (cand<=8) {
    tab.put(cand, 0); // Asocia 0 al candidato cand
    cand= cand+1;
  }

  // Leer los votos
  while(true) {
    int candVoto= lect.readInt();
    if (lect.eofReached())
      break;
    // Obtenemos el numero de votos del candidato
    int anterior= tab.getInt(candVoto); 
    int nuevo= anterior+1;
    tab.put(candVoto, nuevo); // Cambiar el valor asociado
  }

  cand= 1;
  while (cand<=8) {
    println("Candidato "+cand+": "+tab.getInt(cand));
    cand= cand+1;
  }

  lect.close();
Observaciones:


Arreglos con valores no enteros

El valor asociado a una llave puede ser un valor real. Por ejemplo, podemos asociar a cada candidato su estatura:

    Map tabEst= new Map();
    tabEst.put(1, 1.70);
    tabEst.put(2, 1.85);
    ...
    println("La estatura del candidato 3 es "+
            tabEst.getDouble(3));
También podemos asociar a cada candidato su nombre:

    Map tabNombres= new Map();
    tabNombres.put(1, "Ronald Reagan");
    tabNombres.put(2, "Margaret Tatcher");
    ...
    println("El candidato 5 es "+tabNombres.getString(5));

Tarea:

El archivo ``est.txt'' contiene los nombres de cada candidato en el siguiente formato:

    2:Margaret Tatcher
    8:Boris Yeltsin
    ...
    1:Ronald Reagan
El primer campo indica el número del candidato y el segundo el nombre del candidato. Los candidatos vienen en cualquier orden en el archivo. Escriba un programa que lea el archivo ``est.txt'' y construya un arreglo asociativo que asocie el número del candidato (la llave) con su nombre. Luego, el programa debe entablar el siguiente diálogo con el usuario:

    Número de candidato ? 8
    Su nombre es Boris Yeltsin
    Número de candidato ? 1
    Su nombre es Ronald Reagan
    Número de candidato ? x
    Su nombre es ...
    ...
    Número de candidato ? 0
    fin