Objetivos: Extender el concepto de arreglo asociativo con llaves de tipo entero a arreglos con llaves de tipo String.
Temas:
Ejemplo:
Ejercicio:
StringMap tab= new StringMap();
tab.put("pedro", 1.75);
tab.put("alberto", 1.9);
println(tab.getDouble("pedro")); // 1.75
println(tab.getDouble("pedro")); // 1.9
El archivo "votos.txt" contiene las preferencias de los electores en una elección. Cada línea contiene el nombre del candidato preferido por un elector. No se conoce los nombres de los candidatos. Escriba un programa que haga el recuento de votos. La salida del programa debe ser:
Margaret Tatcher: 20 votos
Boris Yeltsin: 9 votos
Ronald Reagan: 17 votos
... etc ...
Se usa el arreglo asociativo recuento para mantener el número de votos de cada candidato. La idea es que recuento.getInt("xxx") entregará la cantidad de votos percibidos por el candidato "xxx".
Creación
Crea un arreglo inicialmente vacío.
StringMap recuento= new StringMap();
Consulta
Para obtener la cantidad de votos captados por "Margaret Tatcher" se evalúa:
Es decir, se usa el nombre del candidato como llave en el arreglo. El
valor asociado al nombre es entonces su número de votos.
int votos= recuento.getInt("Margaret Tatcher");
Existencia de una llave
Al obtener el valor asociado a una llave, se debe haber establecido previamente un valor para esa llave en el arreglo. Como éste no será el caso la primera vez que se encuentre el nombre de un candidato en el archivo, se deberá consultar primero si esa llave existe en el arreglo mediante:
Establecer una asociación
int votos= 0;
if (recuento.isMapped("Michael Jackson"))
votos= recuento.getInt("Michael Jackson");
Para establecer un nuevo valor para una llave en el arreglo se usa put:
Si la llave no existía previamente en el arreglo, se crea la llave
y se establece la asociación. Si la llave sí existía previamente,
se cambia su valor asociado por el resultado de votos+1.
recuento.put("Michael Jackson", votos+1);
Recorrido de las llaves de un StringMap
Después de leer todo el archivo y contabilizar todos los votos, es necesario conocer todas las llaves presentes en el arreglo. Para esto se obtiene un enumerador de las llaves del arreglo invocando el método keys():
En cada iteración, la variable nombre corresponderá al
nombre de un candidato. Cada nombre aparecerá una sola vez. Para
averiguar cuantos votos obtuvo se evalúa recuento.getInt(nombre).
StringKeyEnum enum= recuento.keys();
while (enum.hasMoreKeys()) {
String nombre= enum.nextKey();
...
}
Programa final:
Por lo tanto, para la clase StringMap se aplican los mismos patrones de
programación que para la clase Map. La única diferencia radica en
que las llaves deben ser de tipo String.
StringMap recuento= new StringMap();
TextReader lect= new TextReader("votos.txt");
while (true) { // Cuenta las apariciones
String nombre= lect.readLine();
if (lect.eofReached())
break;
int votos= 0;
if (recuento.isMapped(nombre))
votos= recuento.getInt(nombre);
recuento.put(nombre, votos+1);
}
// Muestra los resultados
StringKeyEnum enum= recuento.keys();
while (enum.hasMoreKeys()) {
String nombre= enum.nextKey();
println(nombre+": "+recuento.getInt(num));
}
Observaciones:
Por otra parte, los casos en donde se necesitan llaves reales, se pueden resolver transformando las llaves en números enteros (multiplicando por ejemplo por 10, 100, etc.).
Los contenedores más usados son:
De la misma forma, una pila es un remedo de lo que ocurre con una pila de papeles encima del escritorio. Si se coloca un papel encima de la pila, éste se puede extraer primero. El que está en el fondo de la pila, sólo se podrá extraer cuando se hayan extraído todos los que están encima de él.
En una consulta médica, se necesita un programa que indique el orden de atención de los pacientes. Los pacientes deben atenderse en orden de llegada (el primero en llegar es el primero en ser atendido). Al llegar un paciente, éste indica su nombre a la secretaria que opera el computador. Cuando el médico queda libre, la secretaria consulta en el computador cuál es el próximo paciente que debe ser atendido.
El programa debe responder al siguiente diálogo:
Ingrese un 1 para agregar un paciente
Ingrese un 2 para atender un paciente
Ingrese un 3 para terminar
Opción ? 1
Nombre del paciente ? juan
Opción ? 1
Nombre del paciente ? pedro
Opción ? 1
Nombre del paciente ? diego
Opción ? 2
Atender al paciente: juan
Opción ? 1
Nombre del paciente ? ana
Opción ? 2
Atender al paciente: pedro
Para resolver este problema usaremos una cola. Una cola es un contenedor que ofrece métodos para agregar elementos al final de la cola y para extraer el elemento que se encuentra en primer lugar en la cola.
Creación:
Crea una cola inicialmente vacía.
Queue pacientes= new Queue();
Agregar un elemento:
Agrega "ana" al final de la cola. Para poder extraer "ana", se deben
extraer primero todos los elementos que se hayan agregado antes que
"ana". También se pueden agregar valores de tipo int, double o boolean.
pacientes.put("ana");
Extraer un elemento de la cola:
Extrae el primer elemento de la cola. No se puede extraer el segundo
elemento sin haber extraído previamente el primero. La siguiente
figura muestra el efecto que producen los métodos put y
getString:
String nombre= pacientes.getString();

También existen getInt(), getDouble y getBoolean para extraer valores de otros tipos.
Consultar si la cola está vacía:
Antes de extraer un elemento de la cola hay que verificar que la cola no este vacía, porque se produce un error en tiempo de ejecución cuando se intenta extraer un elemento de una cola vacía.
Programa:
if (pacientes.isEmpty())
println(pacientes.getString());
else
println("no hay pacientes en espera");
Queue pacientes= new Queue();
println("Ingrese un 1 para agregar un paciente");
println("Ingrese un 2 para atender un paciente");
println("Ingrese un 3 para terminar");
while (true) {
// Seleccionar una opcion
print("opcion ? ");
int opcion= readInt();
if (opcion==1) {
// Ha llegado un nuevo paciente. Se pide el nombre y se agrega
// a la cola.
println("Nombre del paciente ? ");
String nombre= readLine();
pacientes.put(nombre);
}
else if (opcion==2) {
// El medico queda disponible para atender un nuevo paciente.
// El nombre del proximo paciente es aquel que se encuentra
// en primer lugar en la cola.
if (pacientes.isEmpty())
println("No hay pacientes en espera");
else {
String nombre= pacientes.getString();
println("Atender al paciente: "+nombre);
}
else if (opcion==3)
break;
else
println("La opcion es invalida");
}