Temas:
Con esta referencia es posible llegar directamente al último eslabón
sin tener que visitar todos los eslabones de la lista enlazada:
class StringQueue extends Program {
EslabonCola primero;
EslabonCola ultimo;
... // Los métodos getString, put y size
}
Análisis del tiempo de ejecución de cada operación:
void put(String s) {
EslabonCola e= new EslabonCola(s, null);
if (primero==null)
primero= ultimo= e;
else {
ultimo.prox= e;
ultimo= e;
}
}
Observe que esto no significa que la cola no pueda estar vacía. La
cola está vacía cuando la lista enlazada contiene exactamente un
eslabón (el eslabón falso).
class StringQueue extends Program {
EslabonCola primero;
EslabonCola ultimo;
StringQueue() {
primero= ultimo= new EslabonCola(null, null); // eslabón falso
}
String getString() {
if (primero.prox==null) {
println("Cola vacia");
exit();
}
String s= primero.prox.s;
primero.prox= primero.prox.prox;
return s;
}
int size() {
int cont= 0;
EslabonCola e= primero.e;
while (e!=null) {
e= e.prox;
cont= cont+1;
}
return cont;
}
void put(String s) {
ultimo.prox= new EslabonCola(s, null);
ultimo= ultimo.prox;
}
}
La implementación es la misma sólo que cambia el tipo del dato
que se manipula:
class EslabonCola {
Object o;
EslabonCola prox;
EslabonCola(Objecto o, EslabonCola prox) {
this.o= o;
this.prox= prox;
}
}
class Queue extends Program {
EslabonCola primero;
EslabonCola ultimo;
...
Object get() {
Object o= primero.prox.o;
primero.prox= primero.prox.prox;
return o;
}
void put(Object o) {
ultimo.prox= new EslabonCola(o, null);
ultimo= ultimo.prox;
}
}
El error se produce porque get entrega un objeto, y un objeto es
más general que un string y por lo tanto no se puede almacenar
en una variable de tipo String. Observe que put recibe un objeto
como parámetro y se le pasa un string como argumento. Esto sí
se puede hacer porque un string es una forma más restringida
de objeto, pero es un objeto finalmente.
Queue q= new Queue();
q.put("hola"); // Proyección
q.put("que");
String s= q.get(); // Error durante la compilación
La última instrucción se puede escribir de la siguiente forma para que no de error:
Ahora no es posible operar con el objeto como un string. Para
poder almacenarlo en una variable de tipo String y así poder
aplicarle las operaciones que acepta un string se debe usar
un cast:
Object s= q.get(); // Correcto en compilación y ejecución
... substring(s, 1, 2) ... // Error en tiempo de compilación
String s= (String)q.get(); // Correcto en compilación y ejecución
... substring(s, 1, 2) ... // Correcto
Esto significa que los enteros no pueden ser considerados como
una subclase de Object. Para solucionar este problema Java ofrece
la clase Integer que sí es una subclase de Object. La operaciones
que acepta esta clase son las siguientes:
q.put(1); // Error de tipos en tiempo de compilación
Ejemplo | Significado | Declaración |
---|---|---|
Integer objent= new Integer(1); | Construye un objeto Integer que almacena el 1 | Integer(int i) |
int i= objent.intValue() | Entrega el valor entero almacenado en objent | int intValue() |
El objeto objent es un objeto y por lo tanto puede ser colocado en una cola:
Sin embargo, al ser un objeto pierde sus operaciones como entero
y no se puede operar como tal:
q.put(objent); // Correcto
Con la clase Integer ahora es posible almacenar cualquier entero
en una cola. Supongamos que necesitamos agregar el entero e en
una cola y posteriormente extraerlo. Entonces el siguiente
código es una receta para lograr esto:
objent= objent+1; // Error de tipos en tiempo de compilación
Java también ofrece las clases estándares Double y Boolean para
trabajar con los reales y los valores de verdad como objetos. Observe
que se diferencian únicamente de los tipos de datos primitivos double
y boolean porque Double y Boolean comienzan con una letra mayúscula
y porque Double y Boolean son subclases de Object.
q.put(new Integer(e)); // Coloca el entero e en la cola
...
int f= ((Integer)q.get()).intValue(); // Recupera el valor e de la cola
class Integer {
private int e; // No es accesible desde fuera de la clase
Integer(int e) {
this.e= e;
}
int intValue() {
return e;
}
}