java 278-287 ejercicios interfaces

11
•. ---- Programación en Java 2 Problemas resueltos INTERFACES Ejercicio 8.1: , Escriba una interfaz ColeccionSimple que declare los siguientes métodos: estáVacía(): devuelve true si la colección está vacía y false en caso contrario. extraer(): devuelve y elimina el primer elemento de la colección. primero(): devuelva el primer elemento de la colección. añadir(): añade un objeto por el extremo que corresponda y devuelve true si se ha añadido y false en caso contrario. A continuación, escriba una clase PilaArray que implemente esta interfaz utilizando para ello un array de Object y un contador de objetos. Planteamiento: En la interfaz se declaran todos los métodos sin implementar ninguno. Para la clase se utilizan como atributos un array de Object y un entero que sirve de contador de objetos. El constructor recibe por parámetro el tamaño máximo de la pila. El método estáVací a () comprueba si el contador es O. El método añadi r() comprueba que cabe el elemento y si es así, lo añade en la celda que indica el contador, posteriormente incrementa el valor del contador. Devuelve true o fa 1se según si se ha añadido o no. primero() si está vacía lanza NoSuchElementException, si no devuelve el elemento que está en la celda indicada por contador - lo extraer () si está vacía lanza NoSuchElementExcept ion, si no decrementa el contador y devuelve el elemen- to que está en la celda indicada por el contador después de decrementarse. NoSuchElementExcept ion hereda de Runt i meExcept ion, por lo que no necesita ser declarada en la cláusula throws del método. Se sobreescribe el método toString() de manera que devuelva los objetos encerrados entre corchetes y separados por comas, comenzando por el último elemento insertado y terminando por el primero. Solución: public interface ColeccionSimple boolean estáVací a() : -+-------------------' boolean añadir(Object o): Object primero(): -+-------------11 Object extraer(): Losmétodossonpub1ic aunque noseindiqueexplícitamente. } import java.util.NoSuchElem public class PilaArray impl public PilaArray(int tamañoMaxlmo){ array = new ObjectCtamañoMáximoJ: contador = O: entException: ements ColeccionSimple{ ¿ Pi1aArray implementa ColeccionSimple. I Array deObject, podráreferenciar a cualquier lipodeobjetos. private ObjectCJ array: private int contador: } public boolean estáVacía(){

Upload: vanesa-miranda

Post on 27-Oct-2015

141 views

Category:

Documents


12 download

TRANSCRIPT

Page 1: Java 278-287 Ejercicios Interfaces

•.---- Programación en Java 2

Problemas resueltos

INTERFACES

Ejercicio 8.1: ,Escriba una interfaz ColeccionSimple que declare los siguientes métodos:

• estáVacía(): devuelve true si la colección está vacía y false en caso contrario.• extraer(): devuelve y elimina el primer elemento de la colección.• primero(): devuelva el primer elemento de la colección.• añadir(): añade un objeto por el extremo que corresponda y devuelve true si se ha añadido y false en

caso contrario.

A continuación, escriba una clase PilaArray que implemente esta interfaz utilizando para ello un array deObject y un contador de objetos.

Planteamiento: En la interfaz se declaran todos los métodos sin implementar ninguno.Para la clase se utilizan como atributos un array de Object y un entero que sirve de contador de objetos.El constructor recibe por parámetro el tamaño máximo de la pila.El método estáVací a () comprueba si el contador es O.El método añadi r() comprueba que cabe el elemento y si es así, lo añade en la celda que indica el contador,

posteriormente incrementa el valor del contador. Devuelve true o fa 1se según si se ha añadido o no.primero() si está vacía lanza NoSuchElementException, si no devuelve el elemento que está en la celda

indicada por contador - loextraer () si está vacía lanza NoSuchElementExcept ion, si no decrementa el contador y devuelve el elemen-

to que está en la celda indicada por el contador después de decrementarse.NoSuchElementExcept ion hereda de Runt i meExcept ion, por lo que no necesita ser declarada en la cláusula

throws del método.Se sobreescribe el método toString() de manera que devuelva los objetos encerrados entre corchetes y

separados por comas, comenzando por el último elemento insertado y terminando por el primero.

Solución:public interface ColeccionSimple

boolean estáVací a() :-+-------------------'boolean añadir(Object o):Object primero(): -+-------------11Object extraer():

Losmétodossonpub1ic aunquenose indiqueexplícitamente.

}import java.util.NoSuchElempublic class PilaArray impl

public PilaArray(int tamañoMaxlmo){array = new ObjectCtamañoMáximoJ:contador = O:

entException:ements ColeccionSimple{ ¿

Pi1aArray implementaColeccionSimple.

I Array de Object, podráreferenciara cualquierlipodeobjetos.

private ObjectCJ array:private int contador:

}public boolean estáVacía(){

Page 2: Java 278-287 Ejercicios Interfaces

Interfaces ---- •.return contador == O;

public boolean añadir(Object o){if (contador == array.length)

return false;else{

array[contador] = o;contador++;return true;

public Object primero(){if (estáVacía())

throw new NoSuchElementExceptionO; +----------11else

return array[contador-l];

No es necesariodeclararenlacabeceralaexcepciónNoSuchElementException.

public Object extraer(){if (estáVacía())

throw new NoSuchElementException();else

return array[ --contador] .••.•~------------11 Se predecrementaelcontador. ]

public String toString(){String s = "I":for (int i = contador - 1: i >= O; i-) {

S += array[i].toString()+" .";}if (!estáVacía())

return s.substring(O. s.lengthO - 1) + "]"; .•••~-----1else

return s + "I":

Se eliminalaúltimacoma. ]

Comentario: En el método toStri ng(), se podría declarar la variable s del tipo Stri ngBuffer para conseguirmayor eficiencia.

Ejercicio 8.2:Escriba una clase, de nombre PruebaColeccionSimple, en la que se implementen dos métodos:

a) rellenar(): recibe por parámetro un objeto de tipo ColeccionSimple y añade los números del uno al diez.b) imprimirYVaciar(): recibe por parámetro un objeto de tipo ColeccionSimple y va extrayendo e impri-

miendo los datos de la colección hasta que se quede vacía.c) En la aplicación principal cree un objeto de tipo PilaArray, llame a los métodos rellenar() e

imprlmirYVaciar() pasando este objeto por parámetro. Escriba en la pantalla el contenido de la pilaantes y después de llamar a imprimirYVaciar().

?

Page 3: Java 278-287 Ejercicios Interfaces

•.---- Programación en Java 2

Planteamiento: En los métodos rellenar() e imprimi rYVaci are )el parámetro puede ser un objeto declaradodel tipo de una interfaz. Lo importante, y con lo que cuenta el método, es que reciba un objeto de una clase queimplemente esta interfaz y, por tanto, tendrá implementados los métodos de ColeccionSimple.

a) rellenarO: se realiza un for con un int que vaya de uno a diez y se llama a añadirO pasando esteentero por parámetro. Se realiza una conversión automática de i nt en Integer.

b) imprimirYVaciar(): se realiza un whi le, y mientras que no esté vacía se imprime en la pantalla el resul-tado del método extraer(). r

e) Se crea el objeto de tipo Pi 1aArray, al pasarlo por parámetro a los métodos que reciben Colecci onSimpl eno hay problemas de tipo. Como Pi 1a hereda de Co1ecc i onS i mp1e, la conversión de tipo hacia arriba serealiza automáticamente. imprimi rYVaci arO imprimirá en el contrario al que se han añadido.

Solución:public class PruebaColeccionSimple (

public static void rellenar(ColeccionSimple c){tor (i nt i = 1: i <= 10: i ++) (

c.añadir(i); ~------------------------------------~IPor ligaduradinámicasellamaal métodoañadi r()que correspondaa c.

publiC static void imprimirYVaciar(ColeccionSimple colección){while(!colección.estáVacía(»{

System. out. printl n(colección .extreer O). +-----------------.;1Se llamaautomáticamenteal métodotoStri ng()delobjetoque devuelve.

public static void main(String[] args)PilaArray p = new PilaArray(20);re 11enar( p) ; +-------------------------------------11System. out. printl n( "La pi 1a: "+p);imprimirYVaciar(p);System. out. printl n( "La pil a: "+p);

p se conviertea Co1ecci onSimp1eautomáticamente.

Nota: Fíjese que los métodos rellenarO e imprimirYVaciarO son exactamente iguales que en el Ejercicio5.21 del Capítulo 5. Cuando se recibe un parámetro, no importa si el tipo es una clase o una interfaz, loimportante es que con el objeto recibido se pueda llamar a los métodos. Por ligadura dinámica se llamará almétodo correspondiente a la clase del objeto que se reciba por parámetro.

Ejercicio 8.3:Escriba una clase Cola que implemente la interfaz ColeccionSimple usando un objeto de la clase LinkedList.

Planteamiento: Cola implementa la interfaz ColeccionSimple, para ello delegará en un atributo de tipoLi nkedL i st. Se establece una relación de composición entre Cola y Li nkedL i sto Para implementar la claseCo1a, se inserta por el final de la Li nkedL i st y se extrae por el principio.

Cola implementaColeccionSimpl e.Solución:import java.util.LinkedList;public class Cola implements ColeccionSimple{ ~ -.J

Page 4: Java 278-287 Ejercicios Interfaces

Interfaces ---- •.AtributoL;nkedL ;stparaelementosObject.

pri vate Linkedl.í st<Object> 1ista: +--------,I

public Cola() (lista = new LinkedList<Object>();

public boolean añadir(Object obj){lista.addLast(obj);return true: +------------------11 Siempre devuelvetrue, ya que

siemprese añade elelemento.

public Object extraer(){return lista.removeFirst();

public boolean estáVacía(){return lista.isEmpty();

public Object primero(){return lista.getFirst();

public String toString(){return lista.toString();

Comentarios: En los métodos primero() o extraer(), los métodos de LinkedList lanzan la excepciónNoSuchEl ementExcept ion si la cola estuviese vacía.

Ejercicio 8.4:Escriba una clase PilaArrayList que implemente la interfaz ColeccionSimple heredando de ArrayList.

Planteamiento: Java permite heredar de una sola clase e irnplementar todas las interfaces que se desee. Portanto, para este ejercicio, la clase Pi 1aArrayL i st hereda de ArrayL i st e irnplementa la interfaz Co1ecci onSimp 1e.Para irnplementar los métodos de Col ecci onSi mp1e se utilizan los métodos heredados de ArrayL i st. En estaimplementación se inserta y se extrae por el principio del ArrayL i sto

public boolean estáVacíareturn isEmpty();

~ i Hereda de ArrayL ;st de Objecte implementaCo 1eccí onS; mp 1ealmismo tiempo.

(){ I Llama a super () automáticamente.EnI estecaso alconstructorde ArrayL ist.

Solución:import java.util.ArrayList;public class PilaArrayList extends ArrayList<Object> implements ColeccionSimple{

public PilaArrayList()}

public boolean añadir(Object obj){

Page 5: Java 278-287 Ejercicios Interfaces

.----- Programación en Java 2

add(O. Obj);~-""Ireturn true;

Se invocan los métodos de ArrayL i stcomo si estuviesen en esta clase, yaque se heredan.

public Object primero(){return get(O);

public Object extraer(){return remove(O);

Nota: El método toStri ng() no se implementa porque se hereda de ArrayL i st.

Comentario: La interfaz Co1ecci onS i mp1e y sus descendientes se han implementado para almacenar objetosde tipo Object. Es preferible declarar estas clases genéricas con tipo parametrizado, de manera que el clienteelija qué tipo de datos quiere almacenar. Para más información acerca de cómo hacer la clase ColeccionSimplegenérica consulte el Ejercicio 9.6 del Capítulo 9.

En los métodos primero() o extraer-O, los métodos de ArrayL i st lanzan la excepción IndexOutOfBoundsExcept ion si la pila estuviese vacía.

Ejercicio 8.5:Modifique el método main de la clase del Ejercicio 8.2 para que en lugar de crear un objeto de tipo PilaArray,se creen dos objetos de tipo Cola y PilaArrayList. Realice las mismas operaciones que realizó para el objetoPilaArray ..

Planteamiento: Es el mismo que en el Ejercicio 8.2, los métodos rell enar() e imprimi rYVaciar() sirven paraobjetos de cualquier clase que implemente Col eccionSimpl e, por tanto el código será el mismo excepto por lacreación de los objetos.

Solución:public class Main (

public static void rellenar(ColeccionSimple colección){for (tnt i = 1: i <= lO; i++){+-----------------11

colección.añadir(i);

Son los mismos métodosque en el Ejercicio8.2.

public static void imprimirYVaciar(Co1eccionSimp1e co1ección){while( !co1ección.estáVacía()){ ¡¡==============,

System.out. println(colección.extraer()); +---~I Por ligaduradinámica se ejecutan los métodosque corresponden a la clase de c.

}public static void main(String[] args) (

Cola cola = new Cola();rellenar(co1a); +--------------------11System. out. printl n( "La col a: " + col a);imprimirYVaciar(co1a);System. out. printl n( "La col a: " + col a) ;Pi1aArrayList pila = new PilaArrayList();

Se hace automáticamente laconversión a Co1eccionSimp 1e.

Page 6: Java 278-287 Ejercicios Interfaces

Interfaces ~

rellenar(pila) ;System.out.println("La pila: " + pila);imprimirYVaciar(pila);System.out.println("La pila: " + pila);

Ejercicio 8.6:Escriba un programa para una biblioteca que contenga libros y revistas.

a) Las características comunes que se almacenan tanto para las revistas como para los libros son el código, el títuloy el año de publicación. Estas tres características se pasan por parámetro en el momento de crear los objetos.

b) Los libros tienen además un atributo prestado. Los libros cuando se crean no están prestados.c) Las revistas tienen un número. En el momento de crear las revistas se pasa el número por parámetro.d) Tanto las revistas como los libros deben tener (aparte de los constructores) un método toString() que

devuelve el valor de todos los atributos en una cadena de caracteres. También tienen un método quedevuelve el año de publicación y otro para el código.

e) Para prevenir posibles cambios en el programa se tiene que implementar una interfa: Prestable con losmétodos prestar(), devolver() y prestado(). La clase Libro implementa esta interfaz.

Planteamiento:a) Se implementa una superclase de Libro y Revi sta con sus características comunes, que se llama Pub1i -

caci ón. En esta clase además de declarar los tres atributos, se implementa un constructor que reciba porparámetro el valor de los tres atributos. También se implementan los métodos getAño(), getCódigo() y unmétodo toString() que devuelve la información de estos tres atributos en forma de cadena de texto.

b) Se implementan las clases Libro y Revi sta que añaden sus nuevos atributos.e) Se escriben sus constructores, que llaman al constructor de la superclase,d) Se sobreescribe el método toStri ng() que también llama al método toStri ng() de la superclase.e) La interfaz Prestable declara los métodos indicados sin implementarlos, la clase Libro implementa

Prestab 1e y, por tanto, todos sus métodos.

Solución:public class Publicacion {

private String código;private String título;private int año;

public Publicacion(String código, String título, int año)] .this.código = código;this.título = título;this.año = año;

public int getAño(){return año;

public String getCódigo(){return código;

Page 7: Java 278-287 Ejercicios Interfaces

Interfaces ---- ..rellenar(pila) :System.out.pr-tnt lntLa pila: n + pila):imprimirYVaciar(pila):Systen.outpr-tnt lnr'La pila: n + pila):

Ejercicio 8.6:Escriba un programa para una biblioteca que contenga libros y revistas.

a) ÚJs características comunes que se almacenan tanto para las revistas como para los libros son el código, el títuloy el año de publicación. Estas tres características se pasan por parámetro en el momento de crear los objetos.

b) Los libros tienen además un atributo prestado. Los libros cuando se crean no están prestados.c) Las revistas tienen un número. En el momento de crear las revistas se pasa el número por parámetro.d) Tanto las revistas como los libros deben tener (aparte de los constructores) un método toString() que

devuelve el valor de todos los atributos en una cadena de caracteres. También tienen un método quedevuelve el año de publicación y otro para el código.

e) Para prevenir posibles cambios en el programa se tiene que implementar una interfa: Prestable con losmétodos prestar(), devolver() y prestado(). La clase Libro implementa esta interfaz;

Planteamiento:a) Se implementa una superclase de Libro y Revi sta con sus características comunes, que se llama Pub1i -

caci ón. En esta clase además de declarar los tres atributos, se implementa un constructor que reciba porparámetro el valor de los tres atributos. También se implementan los métodos getAño(), getCódigo() y unmétodo toString() que devuelve la información de estos tres atributos en forma de cadena de texto.

b) Se implementan las clases Libro y Revi sta que añaden sus nuevos atributos.e) Se escriben sus constructores, que llaman al constructor de la superclase,d) Se sobreescribe el método toStri ng() que también llama al método toStri ng() de la superclase.e) La interfaz Prestab 1e declara los métodos indicados sin implementarlos, la clase Libro implementa

Prestab 1e y, por tanto, todos sus métodos.

Solución:public class Publicacion {

private String código:private String título:private int año:

public Publicacion(String código. String título. int año)] .this.código = código:this.título = título:this.año = año:

public int getAño(){return año:

public String getCódigo(){return código:

Page 8: Java 278-287 Ejercicios Interfaces

public String toString(){return "Código: " + código +

"\nT1tulo: " + t1tulo +"\nAño de publicación: " + año + "\n":

~ Programación en Java 2

public class Revista extends Publicacion +-------11 Llamada alconstructorde lasuperclase.

private int número:

public Revista(String código. String título. int año. int número){super(código. título. añO):+----.,this.número = número: Llamada almétodo toString()

de lasuperclase.

public String toString(){return super.toString()

t+ "Número: " + número + "\n":

Llamada almétodo toStri ng()de lasuperclase.

public interface Prestablevoid prestar():void devolver():boolean prestado():

public class Libro extends Publicacion implements Prestable{private boolean prestado:

public Libro(String código. String t1tulo. int año){super(código. título. año):prestado = false:

public void prestar(){prestado = true:

public void devolver(){prestado = false:

public boolean prestado(){return prestado:

public String toString(){return super. toString() + (prestado? "prestado" "no prestado") + "vn":

Page 9: Java 278-287 Ejercicios Interfaces

Interfaces ---~••Ejercicio 8.7:

Escriba una aplicación en la que se implementen dos métodos:

a) cuentaPrestados(): recibe por parámetro un array de objetos y devuelve cuántos de ellos están prestados.b) publicacionesAnterioresA(): recibe por parámetro un array de Publicaciones y un año, devuelve cuántas

publicaciones tienen fecha anterior al año recibido por parámetro.c) En el método main() crear un array de Publicaciones con 2 libros y 2 revistas, prestar uno de los libros,

mostrar por pantalla los datos almacenados en el' array y mostrar por pantalla cuántas publicacioneshay prestadas y cuántas hay anteriores a 1980 utilizando los métodos escritos anteriormente.

Planteamiento:a) cuenta Prestados C) recibe un array de Objetos para que se pueda utilizar tanto con Publicaciones como con

cualquier otro tipo de objetos que se puedan prestar. Para contar cuántos objetos están prestados, se utilizaun contador que se inicializa a O. Se recorre el array comprobando si cada una de las celdas es Prestab 1e.Si lo es, se comprobará si está prestado y en este caso se incrementará un contador. Para comprobar si estáprestado, antes hay que convertirlo a Prestab 1e, ya que la clase Object no tiene el método prestadot).

b) pub 1i caci onesAnteri oresAC) utiliza también un contador inicializado a O. Se recorre el array obteniendoel año de cada una de las publicaciones, se comprueba si es menor que el año recibido por parárnetro y sies así, se incrementa el contador. .

e) El array se puede crear de varias maneras, en esta ocasión se le dan los datos en el momento de crearlo.Para prestar uno de los libros, se accede a una de las celdas, se transforma a Libro y se llama al métodoprestarO.

Para mostrar por pantalla la información se recorre el array y se muestra cada uno de los objetosutilizando su método toStri ngC), al que no es necesario llamar explícitamente. Después se llama a losmétodos implementados anteriormente.

public static int cuentaPrestados(Object[]

i nt contador = O: ----------I~[ Se comprueba que es Prestab 1e. 11for CObject o: 1i sta l { ~ ~ .

if (o instanceof Prestable && «Prestablelol.prestado(llcontador++: t ,tP=I======="""\\

11 Se transformaa Prestab 1e11 para llamara prestadoC ).

1i sta) {

Solución:public class Main

}return contador:

public static int publicacionesAnterioresA(Publicacion[]int contador = O:for (Publicacion p: lista){

Todas las clases que hereden deif (p. getAño() <año) +--------11 Publ icación tienen el métodogetAñoC),

contador++:

lista. int año){

}return contador:

}public static void main(String[] args) {

Publicacion[] biblioteca = {new Libro("CCl", "La fundación", 1951),new Revista("CR1", "El jueves", 2002, 1305),new LibroC"CC2" , "El neuromante" , 1984),new Revista("DR1", "Quo", 2002. 81)}:

Page 10: Java 278-287 Ejercicios Interfaces

.•---- Programación en Java 2

Libro 1 = (LibrO)biblioteCa[OJ;+--------------------,11 . prestar() ;for(Publicacion p: biblioteca){

System.out.println(p);}System.out.println(publicacionesAnterioresA(biblioteca.

" publicaciones anteriores a 1980");System.out.println(cuentaPrestados(biblioteca)+

" libros prestados");

Se transfonnaa Libro parapoderllamara prestar-o.

1980)+

Ejercicio 8.8:Escriba una clase DiscoPrestable que herede de la clase Disco, escrita en el Ejercicio 5.13 del Capítulo 5,sobre herencia e implemente la interfaz Prestable.

Planteamiento: La clase DiseoPrestab 1e hereda de Diseo e implementa el interfaz Prestab 1e implementandotodos sus métodos. Para implementar los métodos de Prestab 1e declara un atributo boa 1ean prestado.

Solución:public class DiscoPrestable extends Disco implements Prestable{

private boolean prestado; Hereda de Diseo e implementaPrestab1e.

public DiscoPrestable(String título. String autor. Formato formato. double duración. Generogénero) (

super(título. autor. formato. duración. género); Llamadaalconstructorde lasuperclase.prestado = false;

pub 1ie void prestar() {+-----------------11 Implementaciónde losmétodosde Prestab 1e.prestado = true;

public void devolver(){prestado = false;

public boolean prestado(){return prestado;

public String toString(){return super. toString() + (prestado? "\nprestado" "\nno prestado") + "vn":

Comentario: Si la clase Diseo estuviera en otro paquete, habría que importar del paquete la cláusula import.

Ejercicio 8.9:En el Ejercicio 8.7 modifique el programa principal para que:

Page 11: Java 278-287 Ejercicios Interfaces

Interfaces ---- •.a) Cree un array de tres objetos Disco.b) Introduzca un DiscoPrestable en cada celda.c) Preste dos de ellos.d) Calcule e imprima por pantalla cuántos están prestados utilizando el método cuentaPrestados().

Planteamiento:a) Se declara el array de Diseo y se crea con tamaño 3.b) Se crean y se introducen los objetos DiseoPrestab 1e celda a celdae) Se prestan dos de ellos accediendo a la celda específica. Se necesita hacer una conversión de tipo a

DiseoPrestabl e para llamar al método prestar( l.d) Se llama al método euentaPrestados ( l, que al recibir un array de Objeet, acepta el array de Diseo.

((Prestab 1e )discos [OJ) .prestar( ) :+------------il«Prestable)discos[2J).prestar():

Conversiónde tipoparapoderllamara prestar().

Solución:public class Main

Igualque en elEjercicio8.7. )public static int cuentaPrestados(Object[J lista){<III(:...------I1int contador = O:for (Object o: lista){

if (o instanceof Prestable && «Prestable)o).prestado())contador++:

}return contador:

public static void main(String[J args)

Disco[J discos = new Disco[3J:discos[OJ = new DiscoPrestable("Hopes and Fears". "Keane".

Formato.mp3. 50, Genero.pop):discos[lJ = new DiscoPrestable("How to dismantle an atomic bomb". "U2",

Formato.cdAudio, 60, Genero.rock):di scos[2J = new DiscoPrestabl e( "Soy gitano", "Camarón",

Formato.cdAudio, 40, Genero.flamenco):~=====,

for (Disco d: discos){

System.out.println(d): Se convierteautomáticamentea arrayde Object.1

System. out. printl n(cuentaPrestados(di scos) + " di scos prestados"):

Comentario: Fíjese en la utilidad de la interfaz Prestabl e, que ha permitido tratar por igual aDiseoPrestab 1e que a Libro. El mismo método sirve para ambas clases, y serviría para cualquier claseque implemente Prestab 1e. Al mismo tiempo Di seoPrestab 1e sigue siendo un Diseo y Libro siguesiendo una Pub1i eaei ón.