From 1b8129b0a65fd5e55c740092d4fa8994032e0d3b Mon Sep 17 00:00:00 2001 From: Heikki Viljanen <hmvilj@utu.fi> Date: Mon, 15 May 2023 13:44:52 +0300 Subject: [PATCH] korjauksia hashCode() metodeihin --- .../fi/utu/tech/ooj/exercise3/Ajoneuvo.java | 1 + .../java/fi/utu/tech/ooj/exercise3/Kirja.java | 4 +++ .../utu/tech/ooj/exercise3/KirjaKokoelma.java | 4 +++ .../fi/utu/tech/ooj/exercise3/Kirjasto.java | 5 ++++ .../java/fi/utu/tech/ooj/exercise3/Main.java | 27 ++++++++++++++++--- .../tech/ooj/exercise3/Tehtava 5 vastaukset | 11 +++++++- 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java index 24473fc..c686aa5 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java @@ -40,6 +40,7 @@ abstract class Ajoneuvo { * jolloin Ajoneuvon, HenkiloAuton ja KuormaAuton tulisi toteuttaa Comparable rajapinta ja * compareTo- rutiini, tai antaa TreeSetille oma Comparator syötteenä, jotta TreeSet voi * asettaa alkiot järjestykseen. + * (Vastaukset myös tiedostossa 'Tehtava 5 vastaukset'.) */ public static <X extends Z, Y extends Z, Z extends Ajoneuvo> Set<Z> yhdista(Set<X> xs, Set<Y> ys){ var tmp = new TreeSet<Z>(); diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java index c5b37ca..6d83839 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java @@ -64,4 +64,8 @@ public class Kirja implements Cloneable{ } return true; } + @Override + public int hashCode(){ + return 127*kirjanNimi.hashCode()+kirjailijanNimi.hashCode()+julkaisuVuosi; + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java index 9896e35..6ecb565 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java @@ -79,4 +79,8 @@ public class KirjaKokoelma implements Cloneable{ } return true; } + @Override + public int hashCode(){ + return 127*kokoelmanNimi.hashCode()+kirjaListaus.hashCode(); + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java index 53232bd..1ef2a6d 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java @@ -136,4 +136,9 @@ public class Kirjasto implements Cloneable{ } return true; } + + @Override + public int hashCode(){ + return 127*kirjastonNimi.hashCode()+osoite.hashCode()+kokoelmat.hashCode()+sivukirjastot.hashCode(); + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java index bd992bb..3e4b9f2 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java @@ -78,8 +78,8 @@ public class Main { rm.put("Eka", 1); rm.put("Toka", 2); rm.put("Kolmas", 3); - System.out.println(rm.get("Eka")); - System.out.println(rm.get("Neljäs")); + System.out.println("Avainta Eka vastaava arvo: "+rm.get("Eka")); + System.out.println("Avainta Neljäs vastaava arvo (avainta ei ole):"+rm.get("Neljäs")); @@ -92,11 +92,32 @@ public class Main { * on ylhäältä rajoitettu kokoelman tyyppiin eli Ajoneuvo-luokkaan. Javan * dokumentaatiossa metodi on public boolean addAll(Collection<? extends E> c). * + * Listoja henkiloautot ja kuormaautot ei voida sijoittaa muuttujaan ajoneuvot, + * sillä nämä eivät ole tyypilään enää yhteensopivia, vaan geneerisen toteutuksen + * vuoksi käytännössä omia aliluokkiaan. * + * Määrittelyn voisi korjata yhteensopivaksi luomalla ajonevot viittaus toisenlaisella + * tyypin määrittelyllä, kuten HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<>(); + * jolloin ajoneuvot kokoelman tyyppi on vapaa, mutta ylhäältä rajoitettu Ajoneuvot + * luokkaan. + * (Vastaukset myös tiedostossa 'Tehtava 5 vastaukset'.) */ - HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); + + //tehtäväpohjan alkuperäinen viittaus + //HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); + + //Tehtävän 5B mukainen yhteensopiva viittaus ylhäältä Ajoneuvot-luokkaan rajoitetulla + //vapaalla tyypillä '?'. + HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<>(); + + //henkiloautot kokoelman geneerinen alityyppi on Henkilöauto HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>(); + //kuormaautot kokoelman geneerinen alityyppi on Kuormaauto HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>(); + //Nyt ajoneuvot on tyyppiyhteensopiva sekä henkiloautot... + ajoneuvot=henkiloautot; + //että kuormaautot kokoelmien kautta, sillä ne ovat polymorfisesti Ajoneuvoja + ajoneuvot=kuormaautot; } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset index a4f610f..8b79f4e 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset @@ -17,4 +17,13 @@ Vastaus 5B) kuorma-autot ovat polymorfisesti myös Ajoneuvoja ja addAll- metodin toteutuksessa on käytetty syötteenä vapaan tyypin kokoelmaa, jonka tyyppi on ylhäältä rajoitettu kokoelman tyyppiin eli Ajoneuvo-luokkaan. Javan - dokumentaatiossa metodi on public boolean addAll(Collection<? extends E> c). \ No newline at end of file + dokumentaatiossa metodi on public boolean addAll(Collection<? extends E> c). + + Listoja henkiloautot ja kuormaautot ei voida sijoittaa muuttujaan ajoneuvot, + sillä nämä eivät ole tyypilään enää yhteensopivia, vaan geneerisen toteutuksen + vuoksi käytännössä omia aliluokkiaan. + + Määrittelyn voisi korjata yhteensopivaksi luomalla ajonevot viittaus toisenlaisella + tyypin määrittelyllä, kuten HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<>(); + jolloin ajoneuvot kokoelman tyyppi on vapaa, mutta ylhäältä rajoitettu Ajoneuvot + luokkaan. \ No newline at end of file -- GitLab