Tema Tema 3 3 EJERCICIOS Conceptos de Java para para Estructu ras de Datos Datos Genericidad
Estruct Estr uctura uras s de Dat Datos os y Algo Algoritm ritmos os
2008/2009
Tem ema a3
1
Ejercicio 3.1 Utilizando la clase Ar r ayLi st , escribe un programa programa (e.g. un mai n dentro de una clase Test Caj a) que realice los siguientes pasos: 1. 2.
Construir un ArrayList ArrayList con 10 Cajas de Enteros (Integer) con los primeros 10 números impares; Recorrer el ArrayList ArrayList para mostrar sus datos por por pantalla
Estruct Estr uctura uras s de Dat Datos os y Algo Algorit ritmos mos
2008/2009
Tem ema a3
2
1
Solución 3.1 import java.util.*; public class Test Caj a { public static void mai n( St r i ng ar gs[ ] ) {
/ / c r ear e l vec t or Ar r ayLi st
> v = new Ar r ayLi st >( 10) ; / / añadi r 10 caj as for ( int i =0; i <10; i ++) { Caj a c = new Caj a( ) ; c. setDato( new I nt eger( 2*i +1) ) ; v. add( c) ; } / / r ecor r er el ar r al i st y most r ar su cont eni do . . “- ” for ( int i =0; i c: v) Syst em. out . pr i nt l n( c. get Dat o( ) ) ;
Estructuras de Datos y Algoritmos
2008/2009
3
Tema 3
Ejercicio 3.2 Completa la clase Garaje (del tema 1). Falta por implementar los métodos: pu
c vo
guar ar e
cu o
v,
n
p aza
…
public int l eer Cuota( int pl aza) {…}
Vehiculo
public Vehiculo(int potencia); public int potencia();
Coche
Moto
ublic Coche int otencia , int numPlazas public int numPlazas();
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
4
2
Solución 3.2 public void guardar Vehi cul o(V v, int pl aza) { if ( ( pl aza >= 0) && ( pl aza < numPl azas) )
pl azas. add( pl aza, v);
Casting para prevenir un “cannot resolve s mbol - numPlazas“ error del compilador
}
public int l eer Cuota( int pl aza) { int cuota = 0; if ( ( pl aza >= 0) && ( pl aza < numPl azas) ) {
/ * obt i ene en v el Vehi cul o aparcado en pl aza */ V v = pl azas. get ( pl aza) ; if (v != null) { if ( v instanceof Coche)
cuota = v. potenci a() * ( ( Coche) v). numPl azas( ) ; ot enci a( ) ;
else cuot a = 2 * v. } } return cuot a; }
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
5
Ejercicio 3.3 Reescribe la clase Caja para exigir que
Su contenido sólo pueda ser numérico (es decir, una clase .
Contiene un nuevo método en esta clase que devuelva la parte entera del valor numérico que contiene la caja.
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
6
3
Solución 3.3 public class Caj a { private T dat o;
super ( ) ; } public T get Dat o( ) { return dat o;
} public void set Dat o ( T d) {
dat o = d; } public int val or Ent er o( ) { return dat o. i nt Val ue( ) ;
} } Estructuras de Datos y Algoritmos
2008/2009
Tema 3
7
Ejercicio 3.4 Se pide diseñar una clase Genérica Caj aPeso que extienda Caj a para añadirle el atributo peso y así poder saber si una Caja pesa más que otra dada; se considerará además que dos Cajas son iguales si i sus pesos son los mismos
8
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
8
4
Solución 3.4 public class Caj aPeso extends Caj a implements Compar abl e>{ private int peso; public Caj aPeso( ) { super( ) ; peso = 0; } public int get Peso( ) { return peso; } public void set Peso( i nt p) { peso=p; } public int compar eTo( Caj aPeso cP) { if ( peso < cP. get Peso( ) ) return - 1; else
if ( peso > cP. get Peso( ) ) return +1; else return 0;
} }
9
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
9
Ejercicio 3.5 ¿Qué líneas producen error?
8.
Fi gur a f 1 = new Ci r cul o( ) ; Fi ur a f 2 = new Cuadr ado Syst em. out . pr i nt l n( f 1. compar eTo( f 2) ) ; Obj ect x = f 1; Syst em. out . pr i nt l n( x. compar eTo( f 1) ) ; Syst em. out . pr i nt l n( ( Compar abl e) x. compar eTo( f 1) ) ; Syst em. out . pr i nt l n( ( ( Compar abl e) x) . compar eTo( f 1) ) ; Syst em. out . pr i nt l n( ( ( Fi gur a) x). compar eTo( f 1) ) ;
9.
Syst em. out . pr i nt l n( f 2. compar eTo( x) ) ;
1. 2.. 3. 4. 5. 6. 7.
10
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
10
5
Solución 3.5 ¿Qué líneas producen error? 1. 2. 3. 4. 5.
Fi gur a f 1 = new Ci r cul o( ) ; Fi ur a f 2 = new Cuadr ado Syst em. out . pr i nt l n( f 1. compar eTo( f 2) ) ; Obj ect x = f 1; Syst em. out . pr i nt l n( x. compar eTo( f 1) ) ;
6.
Cannot find symbol - method compareTo(Figura)
Syst em. out . pr i nt l n( ( Compar abl e) x. compar eTo( f 1) ) ;
Cannot find symbol - method compareTo(Figura)
8.
ys em. ou . pr n n ompar a e x . compar e o Syst em. out . pr i nt l n( ( ( Fi gur a) x). compar eTo( f 1) ) ;
9.
Syst em. out . pr i nt l n( f 2. compar eTo( x) ) ;
7.
;
Cannot find symbol - method compareTo(java.lang.Object) 11
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
11
Ejercicio 3.6 (1/2) Dada la siguiente clase Java: public class Pel i cul aEnDvd { protected St r i ng t i t ul o; protected St r i ng di r ec t o r ; protected i nt anyo; public Pel i cul aEnDvd( St r i ng t , St r i ng d, i nt a) { this. t i t ul o = t ; this. di r ect or = d; this. anyo = a;
} public St r i ng t oSt r i ng ( ) { return " Ti t ul o: " + t i t ul o +
" Di r ect or : " + di r ect or + “ Año: " + anyo; } 12
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
12
6
Ejercicio 3.6 (2/2) Diseñar la clase Java PeliculaEnVenta que representa cualquier película disponible para la venta. 1. Además del título, director y año una PeliculaEnVenta disponga información sobre:
2.
Precio de la película.
Número de copias disponibles para la venta.
Se desea que las PeliculaEnVenta puedan ser ordenadas de manera creciente según el año de estreno y, para el mismo año, según el orden alfabético del título.
2.
Se desea poder consultar el número de copias disponibles para su venta.
3.
Se desea poder decrementar el número de copias disponibles para su venta.
13
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
13
Solución 3.6 (1/2) public class Pel i cul aEnVent a
extends Pel i cul aEnDvd implements Comparabl e
{ protected double pr eci o; pro ec e
n
cop as
spon
es;
public Pel i cul aEnVent a( St r i ng t ,
St ri ng d, i nt a, doubl e p, i nt c) {
s uper ( t , d, a) ; t hi s . pr e ci o = p; t hi s. copi asDi sponi bl es = c; } public int compar eTo( Pel i cul aEnVent a o) { if ( this. anyo < o. anyo) return - 1; else if ( this. anyo > o. anyo) return 1; else return this . t i t u l o. c ompar e To( o . t i t ul o) ;
} 14
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
14
7
Solución 3.6 (2/2) … public boolean equal s ( Obj ec t x) { return ( this. com par eTo( ( Pel i cul aEnVent a) x) == 0 )
; } public int copi asDi sponi bl es( ) { return this. copi asDi sponi bl es;
} public void decr em ent arCopi asDi sponi bl es( ) { this. copi asDi sponi bl es- - ;
} } / / Fi n de l a cl ase Pel i cul aEnVent a
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
15
Ejercicio 3.7
Diseñar la clase Gr upoDePel i cul as, que utiliza un array de Pel i cul aEnVent a. La talla del array es un parámetro del constructor. Diseñar t o St r i ng( ) para que obtenga un listado ordenado de todas las películas disponibles. La ordenación se realizará utilizando: el método estático i ns er c i onDi r ec t a( T a[ ] ) ; de la clase Or denaci on,
en el paquete or denaci onAr r ay:
16
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
16
8
Solución 3.7 public class Gr upoDePel i cul as{
Pel i cul aEnVent a vPel i cul as[ ] ; public Gr upoDePel i cul as( int t al l a) {
vPel i cul as = new Pel i cul aEnVent a[ t al l a] ; } …
Pel i cul aEnVent a implementa Compar abl e y sobreescribe compar eTo
public St r i ng t oSt r i ng( ) {
Or denaci on. i nser ci onDi r ect a( vPel i cul as) ; for ( int i = 0 ; i < vPel i cul as. l engt h ; i ++) Sys t e m. out . pr i nt l n( vPel i c ul as [ i ] ) } }
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
17
Ejercicio 3.8
Dentro de la clase Gr upoDePel i cul as, diseña el método
voi d vender ( Pel i cul aEnVent a aVender) t hr ows Pel i cul aNoEncont r ada.
Si la película está disponible para la venta, actualiza el número de copias disponibles para la venta.
Si era la última copia disponible, la película se borra mediante el método que se asume existe: bor r ar Pel i cul a( Pel i cul aEnVent a p) ;
Si la película no está disponible, se lanza la excepción Pel i cul aNoEncont r ada (se asume implementada en el paquete .
18
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
18
9
Solución 3.8 public class Gr upoDePel i cul as{
Pel i cul aEnVent a vPel i cul as[ ] ; … public void venderPel i cul a(Pel i cul aEnVent a aVender) throws Pel i cul aNoEncontr ada{ boolean encont r ada = f al se; int i = 0; while ( ( i < vPel i cul as. l engt h) && ( ! encont r ada) ) { if ( vPel i cul as[i ] . equal s(aVender ) ) encont r ada= t r ue; else i ++; } if ! e nc ont r a a throw new Pel i cul aNoEncontr ada( “No hay “ + aVender) ; vPel i cul as[ i ] . decrement ar Copi asDi sponi bl es( ) ; if ( vPel i cul as[i ] . copi asDi sponi bl es == 0) bor r ar P el i c ul a( v Pel i c ul as [ i ] ) ; } } Estructuras de Datos y Algoritmos
2008/2009
Tema 3
19
Ejercicio 3.9
Usando genericidad y la clase Ar r ayLi st , diseñar una clase Oper aci ones que:
Tenga un método genérico que devuelva el elemento mínimo de un ArrayList.
Tenga un método genérico que busque un elemento en un ArrayList y devuelva su posición (devolverá -1 si el elemento no está en el ArrayList).
Tenga un método genérico que borre la primera aparición en el ArrayList de un objeto dado, y que devuelva el objeto eliminado (o null si no se encuentra).
20
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
20
10
Solución 3.9 import j ava. ut i l . *; public class Oper aci ones { public static > T minimo( Ar r ayLi st v) {
T mi n = v. get ( 0) ; for ( int i = 1; i < v. si ze( ) ; i ++) if ( v. get ( i ) . compareTo( mi n) < 0) mi n = v. get ( i ) ; return mi n; } public static int buscar( T x, Ar r ayLi st v) { return v. i ndexOf ( x) ;
} ublic static T borrar T x
Ar r a Li st v
int pos = buscar ( x,
v) ; if ( pos == - 1) return nul l ; return v. r emove(pos) ; } } Estructuras de Datos y Algoritmos
2008/2009
21
Tema 3
Ejercicio 3.10
Añade el método i nser ci onDi r ecta a la clase Oper aci ones del ejercicio anterior, modificándolo para que permita ordenar un ArrayList (clase ArrayList) genérico en lugar de un array como hemos visto antes)
public static > void i ns er c i onDi r e ct a ( T a[ ] ) { for( int i
= 1; i < a. l engt h ; i ++ ) { T el emAI nser t ar = a[ i ] ; int pos I ns = i ; for( ; posI ns>0 && el em AI nser t ar. compar eTo( a[ posI ns- 1]) <0; a[posI ns] =a[posI ns- 1] ; a pos ns = e em nser ar ;
posI ns- - )
}
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
22
11
Solución 3.10 publ i c s t at i c > void i nser ci onDi r ect a( ArrayList a) { for ( i nt i
= 1; i < a. s i z e( ) ; i ++) { T el emAI nser t ar = a.get(i) ; int posI ns = i ; for ( ; pos I ns > 0 && el emAI nsert ar . compar eTo( a.get(posIns-1)) < 0; pos I ns - - ) a.set(posIns, a.get(posIns-1)); a.set(posIns, elemAInsertar);
} }
Estructuras de Datos y Algoritmos
2008/2009
Tema 3
23
12