Activitats

Gestió d'excepcions

L’objectiu d’aquesta activitat és practicar el disseny d’excepcions.

Milloreu la implementació de la classe Data03, creant una nova classe anomenada Data04 mostrada tot seguit amb la incorporació de la gestió d’excepcions. Aprofiteu la millora per introduir l’ordre natural en la classe.

Descarregueu tot seguit el codi font de l’enunciat:

Enunciat ( 3.4 KB )

Descarregueu tot seguit el codi font de la solució:

Solució ( 5.9 KB )

Gestió de taules (1)

L’objectiu d’aquesta activitat és comprovar la funcionalitat de la classe Arrays del framework de col·leccions del Java (JCF).

Considereu la jerarquia de classes corresponent a la figura següent, implementada en els fitxers FiguraGeometrica02.java, Rectangle02.java, Cercle02.java i Triangle02.java. El seu codi font el podeu trobar al final de l’enunciat.

Figura

Dissenyeu la classe GrupFiguraGeometricaViaTaula per gestionar un grup de figures geomètriques emmagatzemades en una taula del Java, amb els requeriments següents:

  • El codi de la figura és identificador dins la taula.
  • La classe ha de proporcionar els mètodes bàsics per a la gestió de taules de figures geomètriques (afegir, cercar per codi, extreure, veure quina figura hi ha en una posició determinada, buidar el grup…).
  • La classe ha de proporcionar un mètode per ordenar la taula segons el codi de les figures.
  • La classe ha de proporcionar un mètode per ordenar la taula segons l’àrea de les figures.
  • La classe ha de sobreescriure els mètode equals() heretat de la classe Object.

Cal aprofitar, en el que sigui factible, els mètodes proporcionats per la classe Arrays.

Si cal, podeu millorar el disseny de les classes de la jerarquia que neix a FiguraGeometrica, afegint els mètodes i/o característiques que corresponguin.

Desenvolupeu una altra classe, anomenada ProvaGrupFiguraGeometricaViaTaula, pertanyent a un paquet anomenat proves, que contingui un mètode main() en què es comprovi el funcionament dels mètodes dissenyats en la classe GrupFiguraGeometricaViaTaula.

Allà on ho considereu oportú, utilitzeu excepcions (pròpies o de les que proporciona el Java).

Descarregueu l’arxiu següent amb el codi font de les classes:

Codi ( 2.6 KB )

En primer lloc, cal recordar que la classe Arrays ofereix diverses sobrecàrregues del mètode sort(…) per aconseguir l’ordenació dels elements d’una taula. A nosaltres ens convé utilitzar la sobrecàrrega del mètode sort(…) que permet ordenar una taula d’objectes d’una classe X, sempre que aquesta classe implementi la interfície Comparable.

La interfície Comparable obliga a sobreescriure un mètode compareTo(…) a utilitzar per comparar dos objectes de la classe que implementi la interfície. L’ordre definit pel mètode compareTo(…) s’anomena ordre natural entre els elements de la classe i ha de ser compatible amb el mètode equals(…), de manera que si dos elements són iguals segons el mètode equals(…), llavors el mètode compareTo(…) entre ells ha de donar zero.

Se’ns demana que la classe GrupFiguraGeometricaViaTaula permeti ordenar una taula de figures segons el codi i segons l’àrea, aprofitant, sempre que es pugui, els mètodes de la classe Arrays. Atès que la classe FiguraGeometrica té definit el mètode equals(…) entre dues figures en base a la igualtat dels seus codis, sembla lògic definir l’ordre natural en la classe FiguraGeometrica a partir de la comparació dels codis de les figures. Així podrem aprofitar el mètode sort(…) de la classe Arrays basat en l’ordre natural de la classe a què pertanyen els objectes de la taula per proporcionar un mètode ordenarPerCodi().

Però, i com es pot aconseguir l’ordenació per àrea? L’ordre natural només existeix per a un criteri i, si ja el tenim assignat a la comparació de figures per codi, no el podem emprar per a la comparació de figures per àrea. La classe Arrays, però, també proporciona una sobrecàrrega del mètode sort(…) per ordenar una taula d’objectes segons un criteri que ha de proporcionar un objecte d’una classe que implementi la interfície Comparator.

La interfície Comparator obliga a sobreescriure un mètode compare(…) a utilitzar per comparar dos objectes de qualsevol classe. Com que ens interessa poder comparar figures geomètriques a partir de la seva àrea i hem decidit utilitzar l’ordre natural per comparar figures geomètriques a partir del codi, no ens queda altra sortida que dissenyar una classe que implementi la interfície Comparator per comparar figures geomètriques a partir de l’àrea i així aprofitar el mètode sort(…) de la classe Arrays que necessita un objecte d’una classe que implementi Comparator per proporcionar un mètode ordenarPerArea().

Respecte a la sobreescriptura del mètode equals(), hem de pensar amb lògica quan dos grups de figures geomètriques són iguals. L’enunciat no ens ha definit la igualtat entre grups, però ja que les figures no estan ordenades, pot tenir sentit considerar que dos grups són iguals si per cada figura geomètrica en un grup hi ha una altra figura geomètrica en l’altre grup amb igualtat segons el mètode FiguraGeometrica.equals(). Evidentment, podeu estar en desacord amb aquesta definició, però és la que hem implementat en la solució que es dóna.

La solució a l’activitat està formada pels fitxers següents:

  • FiguraGeometrica04.java, Rectangle04.java, Cercle04.java i Triangle04.java, evolució de la implementació proporcionada de la jerarquia de classes que neix a FiguraGeometrica de manera que passen a implementar la interfície Comparable i el mètode compareTo() sap comparar dues figures geomètriques.
  • Com que FiguraGeometrica implementa la interfície Comparable, ha calgut sobreescriure el mètode compareTo(…), que compara figures geomètriques segons el seu codi (compatible amb el mètode equals(…)).
  • Com que també interessava poder comparar figures geomètriques segons l’àrea, s’ha afegit una classe interna estàtica anomenada ComparatorFiguraGeometricaSegonsArea amb la sobreescriptura del mètode compare(…), que compara figures geomètriques segons la seva àrea. La implementació s’ha efectuat com una classe interna estàtica perquè sembla el lloc més adequat per declarar aquesta classe.
  • Per tal de provar si l’ordenació de figures segons el criteri de l’àrea funciona correctament, s’ha retocat el mètode toString() sobre FiguraGeometrica perquè mostri l’àrea de la figura.
  • GrupFiguraGeometricaViaTaula.java, que defineix la classe que se’ns demanava, amb els mètodes bàsics per a la gestió de taules i amb els dos mètodes d’ordenació indicats.
  • ProvaGrupFiguraGeometricaViaTaula.java, que conté el programa de prova sol·licitat.

Descarregueu l’arxiu següent amb el codi de la solució:

Solució ( 5.1 KB )

Gestió de taules (2)

L’objectiu d’aquesta activitat és comprovar la funcionalitat de la classe Arrays del framework de col·leccions del Java (JCF)

Considereu la jerarquia de classes corresponent al disseny UML de la figura següent, implementada en els fitxers FiguraGeometrica02.java, Rectangle02.java, Cercle02.java i Triangle02.java. El seu codi font el podeu trobar al final de l’enunciat.

Figura

Dissenyeu la classe GrupOrdenatFiguraGeometricaViaTaula per gestionar un grup de figures geomètriques emmagatzemades en una taula del Java, amb els requeriments següents:

  • El codi de la figura és identificador dins la taula.
  • Les figures geomètriques estan permanentment ordenades pel codi.
  • La classe ha de proporcionar els mètodes bàsics per a la gestió de taules de figures geomètriques (afegir, cercar per codi, extreure, veure quina figura hi ha en una posició determinada, buidar el grup…).
  • Les cerques per codi dins la taula s’han d’efectuar de la manera més eficient possible (cerca dicotòmica).
  • La classe ha de sobreescriure els mètode equals() heretats de la classe Object.

Cal aprofitar, en el que sigui factible, els mètodes proporcionats per la classe Arrays.

Si cal, podeu millorar el disseny de les classes de la jerarquia que neix a FiguraGeometrica afegint els mètodes i/o característiques que corresponguin.

Desenvolupeu una altra classe, anomenada ProvaGrupOrdenatFiguraGeometricaViaTaula, pertanyent a un paquet anomenat proves, que contingui un mètode main() en què es comprovi el funcionament dels mètodes dissenyats en la classe GrupOrdenatFiguraGeometricaViaTaula.

Allà on ho considereu oportú, utilitzeu excepcions (pròpies o de les que proporciona el Java).

Descarregueu l’arxiu següent amb el codi font de les classes:

Codi ( 2.6 KB )

En primer lloc, cal recordar que la classe Arrays proporciona diverses sobrecàrregues del mètode binarySearch(…) per efectuar la cerca dicotòmica en una taula ordenada. A nosaltres ens convé utilitzar la sobrecàrrega del mètode binarySearch(…), que permet efectuar la cerca dicotòmica en una taula d’objectes d’una classe X, sempre que aquesta classe implementi la interfície Comparable.

La interfície Comparable obliga a sobreescriure un mètode compareTo(…) a utilitzar per comparar dos objectes de la classe que implementi la interfície. L’ordre definit pel mètode compareTo(…) s’anomena ordre natural entre els elements de la classe i ha de ser compatible amb el mètode equals(…), de manera que si dos elements són iguals segons el mètode equals(…) llavors el mètode compareTo(…) entre ells ha de donar zero.

La classe GrupOrdenatFiguraGeometricaViaTaula ha de mantenir, en tot moment, la taula ordenada per codi i, per tant, el mètode afegir(…) ha de consistir en una inserció ordenada. D’altra banda, atès que la taula estarà ordenada en tot moment, per qüestions d’eficiència, és evident que totes les cerques per codi s’haurien de basar en el mètode binarySearch(…) de la classe Arrays i, perquè això sigui possible, la classe FiguraGeometrica ha de passar a implementar la interfície Comparable implementant l’ordre natural a partir de la comparació dels codis de les figures. I no n’hi haurà prou de comparar dues figures, sinó que també haurà de saber comparar una figura amb un codi de figura.

Respecte a la sobreescriptura del mètode equals(), hem de pensar amb lògica quan dos grups de figures geomètriques ordenades són iguals. L’enunciat no ens ha definit la igualtat entre grups, però ja que les figures estan ordenades, pot tenir sentit considerar que dos grups són iguals si hi ha igualtat de figures geomètriques, dos a dos, entre els dos grups, segons el mètode FiguraGeometrica.equals(), és a dir, si la figura que ocupa la posició i en un grup és igual a la figura que ocupa la posició i en l’altre grup. Evidentment, podeu estar en desacord amb aquesta definició, però és la que hem implementat en la solució que es dóna.

La solució a l’activitat està formada pels fitxers següents:

  • FiguraGeometrica05.java, Rectangle05.java, Cercle05.java i Triangle05.java, evolució de la implementació proporcionada de la jerarquia de classes que neix a FiguraGeometrica de manera que passen a implementar la interfície Comparable i el mètode compareTo() sap comparar dues figures geomètriques, i també una figura geomètrica amb un codi de figura geomètrica.
  • GrupOrdenatFiguraGeometricaViaTaula.java, que defineix la classe que se’ns demanava, amb els mètodes bàsics per a la gestió de taules ordenades.
  • ProvaGrupOrdenatFiguraGeometricaViaTaula.java, que conté el programa de prova sol·licitat.

El codi de la solució és el següent:

Solució ( 5.2 KB )

Gestió de la classe Vector (1)

L’objectiu d’aquesta activitat és comprovar la funcionalitat de les classes Vector i Collections del framework de col·leccions del Java (JCF).

Considereu la jerarquia de classes corresponent al disseny UML de la figura següent, implementada en els fitxers FiguraGeometrica02.java, Rectangle02.java, Cercle02.java i Triangle02.java.

Figura

Dissenyeu la classe GrupFiguraGeometricaViaVector per gestionar un grup de figures geomètriques emmagatzemades en un objecte Vector del Java, amb els requeriments següents:

  • El codi de la figura és identificador dins el vector.
  • La classe ha de proporcionar els mètodes bàsics per a la gestió de vectors (taules) de figures geomètriques (afegir, cercar per codi, extreure, veure quina figura hi ha en una posició determinada, buidar el grup…).
  • La classe ha de proporcionar un mètode per ordenar el vector segons el codi de les figures.
  • La classe ha de proporcionar un mètode per ordenar el vector segons l’àrea de les figures.
  • La classe ha de sobreescriure el mètode equals() heretats de la classe Object.

Cal aprofitar, en el que sigui factible, els mètodes proporcionats per la classe Collections.

Si cal, podeu millorar el disseny de les classes de la jerarquia que neix a FiguraGeometrica, afegint els mètodes i/o característiques que corresponguin.

Desenvolupeu una altra classe, anomenada ProvaGrupFiguraGeometricaViaVector, pertanyent a un paquet anomenat proves, que contingui un mètode main() en el qual es comprovi el funcionament dels mètodes dissenyats en la classe GrupFiguraGeometricaViaVector.

Allà on ho considereu oportú, utilitzeu excepcions (pròpies o de les que proporciona el Java).

Descarregueu l’arxiu següent amb el codi font de les classes:

Codi ( 2.6 KB )

En primer lloc, cal adonar-nos que tenim dues possibilitats d’implementar la classe demanada:

  • Fent que derivi de la classe Vector.
  • Fent que contingui un membre de la classe Vector.

La primera possibilitat provoca que la nostra classe hereti tots els mètodes de la classe Vector i això implicaria haver de sobreescriure tots aquells per als quals la implementació en la classe Vector no fos adequada tenint en compte el caràcter identificador del codi de les figures geomètriques. Per tant, en aquesta solució s’opta per la segona possibilitat.

Respecte als processos d’ordenació que es demanen, cal recordar que la classe Collections proporciona diverses sobrecàrregues del mètode sort(…) per aconseguir l’ordenació dels elements d’una taula. A nosaltres ens convé utilitzar la sobrecàrrega del mètode sort(…), que permet ordenar una taula d’objectes d’una classe X, sempre que aquesta classe implementi la interfície Comparable.

La interfície Comparable obliga a sobreescriure un mètode compareTo(…) a utilitzar per comparar dos objectes de la classe que implementi la interfície. L’ordre definit pel mètode compareTo(…) s’anomena ordre natural entre els elements de la classe i ha de ser compatible amb el mètode equals(…), de manera que, si dos elements són iguals segons el mètode equals(…), llavors el mètode compareTo(…) entre ells ha de donar zero.

Se’ns demana que la classe GrupFiguraGeometricaViaVector permeti ordenar un vector de figures segons el codi i segons l’àrea, aprofitant, sempre que es pugui, els mètodes de la classe Collections. Ja que la classe FiguraGeometrica té definit el mètode equals(…) entre dues figures a partir de la igualtat dels seus codis, sembla lògic definir l’ordre natural a la classe FiguraGeometrica a partir de la comparació dels codis de les figures. Així podrem aprofitar el mètode sort(…) de la classe Collections basat en l’ordre natural de la classe a la qual pertanyen els objectes de la taula per proporcionar un mètode ordenarPerCodi().

Però, i com es pot aconseguir l’ordenació per àrea? L’ordre natural només existeix per a un criteri i, si ja el tenim assignat a la comparació de figures per codi, no el podem emprar per a la comparació de figures per àrea. La classe Collections, però, també proporciona una sobrecàrrega del mètode sort(…) per ordenar una taula d’objectes segons un criteri que ha de proporcionar un objecte d’una classe que implementi la interfície Comparator.

La interfície Comparator obliga a sobreescriure un mètode compare(…) a utilitzar per comparar dos objectes de qualsevol classe. Com que ens interessa poder comparar figures geomètriques a partir de la seva àrea i hem decidit utilitzar l’ordre natural per comparar figures geomètriques a partir del seu codi, no ens queda altra sortida que dissenyar una classe que implementi la interfície Comparator per comparar figures geomètriques a partir de l’àrea, i així aprofitar el mètode sort(…) de la classe Collections que necessita un objecte d’una classe que implementi Comparator per proporcionar un mètode ordenarPerArea().

Respecte a la sobreescriptura del mètode equals(), hem de pensar amb lògica quan dos grups de figures geomètriques són iguals. L’enunciat no ens ha definit la igualtat entre grups, però ja que les figures no estan ordenades, pot tenir sentit considerar que dos grups són iguals si, per cada figura geomètrica en un grup, hi ha una altra figura geomètrica en l’altre grup amb igualtat segons el mètode FiguraGeometrica.equals(). Evidentment, podeu estar en desacord amb aquesta definició, però és la que hem implementat en la solució que es dóna.

La solució a l’activitat està formada pels fitxers següents:

  • FiguraGeometrica04.java, Rectangle04.java, Cercle04.java i Triangle04.java, evolució de la implementació proporcionada de la jerarquia de classes que neix a FiguraGeometrica de manera que passen a implementar la interfície Comparable, de manera que el mètode compareTo() sap comparar dues figures geomètriques. Com que FiguraGeometrica implementa la interfície Comparable, ha calgut sobreescriure el mètode compareTo(…), que compara figures geomètriques segons el seu codi (compatible amb el mètode equals(…)). Com que també interessava poder comparar figures geomètriques segons l’àrea, s’ha afegit una classe interna estàtica anomenada ComparatorFiguraGeometricaSegonsArea amb la sobreescriptura del mètode compare(…), que compara figures geomètriques segons la seva àrea. La implementació s’ha efectuat com una classe interna estàtica perquè sembla el lloc més adequat per declarar aquesta classe. Per tal de provar si l’ordenació de figures segons el criteri de l’àrea funciona correctament, s’ha retocat el mètode toString() sobre FiguraGeometrica perquè mostri l’àrea de la figura.
  • GrupFiguraGeometricaViaVector.java, que defineix la classe que se’ns demanava, amb els mètodes bàsics per a la gestió de vectors (taules) i amb els dos mètodes d’ordenació indicats.
  • ProvaGrupFiguraGeometricaViaVector.java, que conté el programa de prova sol·licitat.

El codi de la solució és el següent:

Solució ( 4.4 KB )

Gestió de la classe Vector (2)

L’objectiu d’aquesta activitat és comprovar la funcionalitat de les classes Vector i Collections del framework de col·leccions del Java (JCF).

Considereu la jerarquia de classes corresponent al disseny UML de la figura següent, implementada en els fitxers FiguraGeometrica02.java, Rectangle02.java, Cercle02.java i Triangle02.java.

Figura

Dissenyeu la classe GrupOrdenatFiguraGeometricaViaVector per gestionar un grup de figures geomètriques emmagatzemades en un objecte Vector del Java, amb els requeriments següents:

  • El codi de la figura és identificador dins el vector.
  • Les figures geomètriques estan permanentment ordenades pel codi.
  • La classe ha de proporcionar els mètodes bàsics per a la gestió de vectors (taules) de figures geomètriques (afegir, cercar per codi, extreure, veure quina figura hi ha en una posició determinada, buidar el grup…).
  • Les cerques per codi dins el vector s’han d’efectuar de la manera més eficient possible (cerca dicotòmica).
  • La classe ha de sobreescriure el mètode equals() heretat de la classe Object.

Cal aprofitar, en el que sigui factible, els mètodes proporcionats per la classe Collections.

Si cal, podeu millorar el disseny de les classes de la jerarquia que neix a FiguraGeometrica afegint els mètodes i/o característiques que corresponguin.

Desenvolupeu una altra classe, anomenada ProvaGrupOrdenatFiguraGeometricaViaVector, pertanyent a un paquet anomenat proves, que contingui un mètode main() en el qual es comprovi el funcionament dels mètodes dissenyats en la classe GrupOrdenatFiguraGeometricaViaVector.

Allà on ho considereu oportú, utilitzeu excepcions (pròpies o de les que proporciona el Java).

Descarregueu l’arxiu següent amb el codi font de les classes:

Codi ( 2.6 KB )

En primer lloc, cal adonar-nos que tenim dues possibilitats d’implementar la classe demanada:

  • Fent que derivi de la classe Vector.
  • Fent que contingui un membre de la classe Vector.

La primera possibilitat provoca que la nostra classe hereti tots els mètodes de la classe Vector i això implicaria haver de sobreescriure tots aquells per als quals la implementació en la classe Vector no fos adequada tenint en compte el caràcter identificador del codi de les figures geomètriques. Per tant, en aquesta solució s’opta per la segona possibilitat.

Respecte als processos d’ordenació que es demanen, cal recordar que la classe Collections proporciona diverses sobrecàrregues del mètode binarySearch(…) per efectuar la cerca dicotòmica en un vector ordenat. A nosaltres ens convé utilitzar la sobrecàrrega del mètode binarySearch(…) que permet efectuar la cerca dicotòmica en un vector d’objectes d’una classe X, sempre que aquesta classe implementi la interfície Comparable.

La interfície Comparable obliga a sobreescriure un mètode compareTo(…) a utilitzar per comparar dos objectes de la classe que implementi la interfície. L’ordre definit pel mètode compareTo(…) s’anomena ordre natural entre els elements de la classe i ha de ser compatible amb el mètode equals(…), de manera que si dos elements són iguals segons el mètode equals(…), llavors el mètode compareTo(…) entre ells ha de donar zero.

La classe GrupOrdenatFiguraGeometricaViaVector ha de mantenir, en tot moment, el vector ordenat per codi i, per tant, el mètode afegir(…) ha de consistir en una inserció ordenada. D’altra banda, atès que el vector estarà ordenat en tot moment, per qüestions d’eficiència, és evident que totes les cerques per codi s’haurien de basar en el mètode binarySearch(…) de la classe Collections i, perquè això sigui possible, la classe FiguraGeometrica ha de passar a implementar la interfície Comparable implementant l’ordre natural a partir de la comparació dels codis de les figures. I no n’hi haurà prou de comparar dues figures, sinó que també haurà de saber comparar una figura amb un codi de figura.

Respecte a la sobreescriptura del mètode equals(), hem de pensar amb lògica quan dos grups de figures geomètriques ordenades són iguals. L’enunciat no ens ha definit la igualtat entre grups, però ja que les figures estan ordenades, pot tenir sentit considerar que dos grups són iguals si hi ha igualtat de figures geomètriques, dos a dos, entre tots dos grups, segons el mètode FiguraGeometrica.equals(), és a dir, si la figura que ocupa la posició i en un grup és igual a la figura que ocupa la posició i en l’altre grup. Evidentment, podeu estar en desacord amb aquesta definició, però és la que hem implementat en la solució que es dóna i s’ha fet cridant directament el mètode equals() entre tots dos vectors, ja que la implementació del mètode Vector.equals() coincideix amb la que nosaltres volem implementar.

La solució a l’activitat està formada pels fitxers següents:

  • FiguraGeometrica05.java, Rectangle05.java, Cercle05.java i Triangle05.java, evolució de la implementació proporcionada de la jerarquia de classes que neix a FiguraGeometrica, de manera que passen a implementar la interfície Comparable i el mètode compareTo() sap comparar dues figures geomètriques i també una figura geomètrica amb un codi de figura geomètrica.
  • GrupOrdenatFiguraGeometricaViaVector.java, que defineix la classe que se’ns demanava, amb els mètodes bàsics per a la gestió de taules ordenades.
  • ProvaGrupOrdenatFiguraGeometricaViaVector.java, que conté el programa de prova sol·licitat.

El codi de la solucio és el següent:

Solució ( 5 KB )

Gestió de la classe Hashtable

L’objectiu d’aquesta activitat és comprovar la funcionalitat de les classes Hashtable i Collections del framework de col·leccions del Java (JCF).

Considereu la jerarquia de classes corresponent al disseny UML de la figura següent, implementada en els fitxers FiguraGeometrica02.java, Rectangle02.java, Cercle02.java i Triangle02.java.

Figura

Dissenyeu la classe GrupFiguraGeometricaViaHashtable per gestionar un grup de figures geomètriques emmagatzemades en un objecte Hashtable de Java, amb els requeriments següents:

  • El codi de la figura sigui el valor d’accés.
  • La classe ha de proporcionar els mètodes bàsics per la gestió d’un grup de figures geomètriques (afegir, cercar per codi, extreure, buidar el grup…).
  • La classe ha de sobreescriure el mètode equals() heretat de la classe Object.

Si cal, podeu millorar el disseny de les classes de la jerarquia que neix a FiguraGeometrica afegint els mètodes i/o característiques que corresponguin.

Desenvolupeu una altra classe, anomenada ProvaGrupFiguraGeometricaViaHashtable, pertanyent a un paquet anomenat proves, que contingui un mètode main() en el qual es comprovi el funcionament dels mètodes dissenyats en la classe GrupFiguraGeometricaViaHashtable.

Allà on ho considereu oportú, utilitzeu excepcions (pròpies o de les que proporciona el Java).

Descarregueu l’arxiu següent amb el codi font de les classes:

Codi ( 2.6 KB )

En primer lloc, cal adonar-nos que tenim dues possibilitats d’implementar la classe demanada:

  1. Fent que derivi de la classe Hashtable.
  2. Fent que contingui un membre de la classe Hashtable.

La primera possibilitat provoca que la nostra classe hereti tots els mètodes de la classe Hashtable. En aquesta solució optem per la segona possibilitat, de manera que la classe només tindrà els mètodes dissenyats per nosaltres.

Respecte a la sobreescriptura del mètode equals(), hem de pensar amb lògica quan dos grups de figures geomètriques són iguals. L’enunciat no ens ha definit la igualtat entre grups, però ja que les figures no estan ordenades, pot tenir sentit considerar que dos grups són iguals si, per cada figura geomètrica en un grup, hi ha una altra figura geomètrica en l’altre grup amb igualtat segons el mètode FiguraGeometrica.equals(), i això coincideix amb la implementació del mètode Hashtable.equals(). Evidentment, podeu estar en desacord amb aquesta definició, però és la que hem implementat en la solució que es dóna.

La solució a l’activitat està formada pels fitxers següents:

  • GrupFiguraGeometricaViaHashtable.java, que defineix la classe que se’ns demanava, amb els mètodes bàsics per a la gestió de vectors (taules) i amb els dos mètodes d’ordenació indicats.
  • ProvaGrupFiguraGeometricaViaHashtable.java, que conté el programa de prova sol·licitat.

El codi font de la solució és:

Solució ( 1.9 KB )

Productes esgotats tractant fitxers XML

L’objectiu d’aquesta activitat és treballar amb el model DOM d’un fitxer XML per fer cerques a les dades que desa, modificar-les, i així generar una nova versió del document.

Partim d’un document XML, anomenat “Productes.xml”, que enumera una llista de productes seguint un format com el següent:

  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <LlistaProductes data="23/11/2011">
  3. <Producte id="1" aLaVenda="true">
  4. <Nom>Producte 1</Nom>
  5. <Preu>10.0</Preu>
  6. <Estoc>3</Estoc>
  7. </Producte>
  8. <Producte id="2" aLaVenda="true">
  9. <Nom>Producte 2</Nom>
  10. <Preu>15.0</Preu>
  11. <Estoc>10</Estoc>
  12. </Producte>
  13. <Producte id="3" aLaVenda="true">
  14. <Nom>Producte 3</Nom>
  15. <Preu>25.0</Preu>
  16. <Estoc>0</Estoc>
  17. </Producte>
  18. <Producte id="4" aLaVenda="true">
  19. <Nom>Producte 4</Nom>
  20. <Preu>5.75</Preu>
  21. <Estoc>50</Estoc>
  22. </Producte>
  23. </LlistaProductes>

Feu un programa que elimini de la venda aquells productes amb estoc inferior a 5, canviant l’atribut “aLaVenda” al valor “false”. En el fitxer d’exemple, el resultat seria que hi ha 2 productes que cal retirar, i els productes 1 i 3 passarien a tenir el seu atribut “aLaVenda” de “true” a “false”. El nou XML resultant s’ha d’escriure en un nou fitxer anomenat “NouDoc.xml”.

  1. import java.io.*;
  2. import javax.xml.parsers.*;
  3. import javax.xml.transform.*;
  4. import javax.xml.transform.dom.*;
  5. import javax.xml.transform.stream.*;
  6. import org.w3c.dom.*;
  7.  
  8. public class ProductesEsgotats {
  9.  
  10. public static void main(String[] args) {
  11.  
  12. DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
  13. Document document = null;
  14. try {
  15. DocumentBuilder builder = builderFactory.newDocumentBuilder();
  16. File f = new File ("Productes.xml");
  17. document = builder.parse(f);
  18. Element arrel = document.getDocumentElement();
  19. NodeList productes = arrel.getElementsByTagName("Producte");
  20. int nreProdEsgotats = 0;
  21. for (int i = 0;i < productes.getLength(); i++) {
  22. Element prod = (Element)productes.item(i);
  23. NodeList estoc = prod.getElementsByTagName("Estoc");
  24. if (estoc.getLength() != 1) {
  25. System.out.println("Alerta! S'ha detectat un producte incorrecte al fitxer.");
  26. } else {
  27. Element e = (Element)estoc.item(0);
  28. String text = getText(e);
  29. int valor = Integer.parseInt(text);
  30. if (valor < 5) {
  31. prod.setAttribute("aLaVenda", "false");
  32. }
  33. }
  34. }
  35.  
  36. TransformerFactory tf = TransformerFactory.newInstance();
  37. Transformer transformer = tf.newTransformer();
  38. DOMSource source = new DOMSource(document);
  39. f = new File("NouDoc.xml");
  40. StreamResult result = new StreamResult(f);
  41. transformer.transform(source, result);
  42.  
  43. } catch (Exception ex) {
  44. System.out.println("Error en la lectura del document: " + ex);
  45. }
  46. }
  47.  
  48. public static String getText(Element e) throws Exception {
  49. NodeList llistaFills = e.getChildNodes();
  50. String text = "";
  51. for (int j = 0; j < llistaFills.getLength(); j++) {
  52. Node n = llistaFills.item(j);
  53. //Mirar si els nodes són de text
  54. if ( (n.getNodeType() == Node.TEXT_NODE)||
  55. (n.getNodeType() == Node.CDATA_SECTION_NODE) ) {
  56.  
  57. text += n.getNodeValue();
  58. }
  59. }
  60. return text;
  61. }
  62.  
  63. }

Productes esgotats amb expressions regulars

L’objectiu d’aquesta activitat és veure com usar expressions regulars i les classes Pattern i Match del Java per cercar paraules amb certes propietats.

Partint del mateix fitxer que a l’exercici anterior, compteu el nombre de productes que hi ha esgotats (l’estoc és exactament 0) i mostreu aquest valor per pantalla. Per resoldre aquesta tasca, però, ara useu expressions regulars aplicades directament sobre el text del document XML. No cal modificar res de l’XML en aquest cas, només comptar el nombre de productes esgotats i mostrar aquest valor per pantalla.

  1. import java.io.*;
  2. import java.util.*;
  3. import java.util.regex.*;
  4.  
  5. public class ProductesEsgotats {
  6.  
  7. public static void main(String[] args) {
  8. try {
  9. Scanner lector = new Scanner(new File("Productes.xml"));
  10. String data = "";
  11. while (lector.hasNextLine()) {
  12. String lin = lector.nextLine();
  13. data += lin + "\n";
  14. }
  15. lector.close();
  16.  
  17. String scriptregex = "<Estoc[^>]*>0</Estoc>";
  18. Pattern pattern = Pattern.compile(scriptregex,Pattern.CASE_INSENSITIVE);
  19. Matcher matcher = pattern.matcher(data);
  20. int nreEstocZero = 0;
  21. while (matcher.find()) {
  22. nreEstocZero++;
  23. }
  24. System.out.println("Hi ha " + nreEstocZero + " productes esgotats");
  25. } catch(Exception ex) {
  26. System.out.println("Error tractant dades: " + ex);
  27. }
  28. }
  29. }

Cercar paraules amb diftongs creixents

L’objectiu d’aquesta activitat és veure com usar expressions regulars i les classes Pattern i Match del Java per cercar paraules amb certes propietats.

Feu un programa en què, dins un text (per exemple, dins un fitxer anomenat “Diftongs.txt”),se cerqui totes les paraules que contenen un subconjunt dels diftongs creixents en català. Concretament, aquells amb un so i/u en posició inicial de mot, seguits d’una vocal.

El programa ha de mostrar per pantalla la paraula sencera que el conté. Per exemple, a partir del text següent:

  1. Hola! Com anem? Cauen moltes coses,
  2. com ara iodes o iogurts, a part d'una
  3. hiena i moltes joies.

El programa mostraria el següent:

  1. iodes
  2. iogurts,
  3. hiena

  1. import java.io.*;
  2. import java.util.*;
  3. import java.util.regex.*;
  4.  
  5. public class Diftongs {
  6.  
  7. public static void main(String[] args) {
  8. try {
  9. Scanner lector = new Scanner(new File("Diftongs.txt"));
  10. String data = "";
  11. while (lector.hasNextLine()) {
  12. String lin = lector.nextLine();
  13. data += lin;
  14. }
  15. lector.close();
  16.  
  17. String scriptregex = " [h]?[iu][aiueo][a-z]* ";
  18. Pattern pattern = Pattern.compile(scriptregex,Pattern.CASE_INSENSITIVE);
  19. Matcher matcher = pattern.matcher(data);
  20. while (matcher.find()) {
  21. System.out.println(matcher.group());
  22. }
  23. } catch(Exception ex) {
  24. System.out.println("Error tractant dades: " + ex);
  25. }
  26. }
  27. }

Anar a la pàgina anterior:
Classes fonamentals
Anar a la pàgina següent:
Exercicis