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 7eaa5d5ac226a452d030d2eabf191911e7637d7e..9301c70524ae6aa0d96db1100c41cea490e716c3 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java @@ -3,6 +3,9 @@ package fi.utu.tech.ooj.exercise3; import java.util.Set; import java.util.TreeSet; +import java.util.Set; +import java.util.TreeSet; + abstract class Ajoneuvo { private String rekisteriNumero; @@ -37,3 +40,4 @@ abstract class Ajoneuvo { return tmp; } } + 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 13d735cebecb2492da4cdc2f967aed46ea347313..8122d9a222a7c0b41abf58079d90f3f298f60cd4 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java @@ -1,5 +1,7 @@ package fi.utu.tech.ooj.exercise3; +import java.util.Objects; + public class Kirja { private String kirjanNimi; private String kirjailijanNimi; @@ -35,5 +37,35 @@ public class Kirja { this.julkaisuVuosi = julkaisuVuosi; } + public Kirja clone(){ + return new Kirja( + kirjanNimi, + kirjailijanNimi, + julkaisuVuosi + ); + } + + + @Override + public String toString() { + return "Kirja{" + + "kirjanNimi='" + kirjanNimi + '\'' + + ", kirjailijanNimi='" + kirjailijanNimi + '\'' + + ", julkaisuVuosi=" + julkaisuVuosi + + '}'; + } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Kirja kirja = (Kirja) o; + return julkaisuVuosi == kirja.julkaisuVuosi && kirjanNimi.equals(kirja.kirjanNimi) && kirjailijanNimi.equals(kirja.kirjailijanNimi); + } + + @Override + public int hashCode() { + return Objects.hash(kirjanNimi, kirjailijanNimi, 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 285fd40c2145f3fa3ce10f18412afb657fe48f5e..1da0f5025e6f55dbf054dd36bc508e28e222cf17 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java @@ -1,17 +1,16 @@ package fi.utu.tech.ooj.exercise3; -import java.io.PrintStream; import java.util.ArrayList; -import java.util.List; +import java.util.Objects; public class KirjaKokoelma { private String kokoelmanNimi; - private ArrayList<Kirja>kirjaListaus; + private ArrayList<Kirja> kirjaListaus; public KirjaKokoelma(String kokoelmanNimi) { this.kokoelmanNimi = kokoelmanNimi; - this.kirjaListaus = new ArrayList<>(); + kirjaListaus = new ArrayList<>(); } public String getkokoelmanNimi() { @@ -30,4 +29,36 @@ public class KirjaKokoelma { kirjaListaus.add(teos); } + public KirjaKokoelma clone(){ + KirjaKokoelma output = new KirjaKokoelma( + kokoelmanNimi + ); + + for(Kirja kirja : kirjaListaus){ + output.lisaaKirja(kirja.clone()); + } + + return output; + } + + @Override + public String toString() { + return "KirjaKokoelma{" + + "kokoelmanNimi='" + kokoelmanNimi + '\'' + + ", kirjaListaus=" + kirjaListaus.toString() + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + KirjaKokoelma that = (KirjaKokoelma) o; + return kokoelmanNimi.equals(that.kokoelmanNimi) && kirjaListaus.equals(that.kirjaListaus); + } + + @Override + public int hashCode() { + return Objects.hash(kokoelmanNimi, kirjaListaus); + } } 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 2478ff6351648daef8b963f175230b13d1aa3569..2902377ca2455a55d1db14c2f368f3bd1d12e370 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java @@ -1,12 +1,10 @@ package fi.utu.tech.ooj.exercise3; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class Kirjasto { + private String kirjastonNimi; private String osoite; private List<KirjaKokoelma> kokoelmat = new ArrayList<>(); @@ -57,5 +55,44 @@ public class Kirjasto { sivukirjastot.add(input); } + public Kirjasto clone(){ + Kirjasto output = new Kirjasto( + kirjastonNimi, + osoite + ); + + for(Kirjasto kirjasto : sivukirjastot){ + output.lisaaSivukirjasto(kirjasto.clone()); + } + + for(KirjaKokoelma kokoelma : kokoelmat){ + output.lisaaKokoelma(kokoelma.clone()); + } + + return output; + } + + @Override + public String toString() { + return "Kirjasto{" + + "kirjastonNimi='" + kirjastonNimi + '\'' + + ", osoite='" + osoite + '\'' + + ", kokoelmat=" + kokoelmat.toString() + + ", sivukirjastot=" + sivukirjastot.toString() + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Kirjasto kirjasto = (Kirjasto) o; + return kirjastonNimi.equals(kirjasto.kirjastonNimi) && osoite.equals(kirjasto.osoite) && kokoelmat.equals(kirjasto.kokoelmat) && sivukirjastot.equals(kirjasto.sivukirjastot); + } + + @Override + public int hashCode() { + return Objects.hash(kirjastonNimi, osoite, kokoelmat, sivukirjastot); + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java b/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java index 761f6b31ca9f278bd8236d6ccbc78b824f69d57c..e0e73a84119350791c5e4b36c11440fff3dba876 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/KuormaAuto.java @@ -2,8 +2,6 @@ package fi.utu.tech.ooj.exercise3; public class KuormaAuto extends Ajoneuvo{ private int kantavuus; - - public KuormaAuto(String rekisteriNumero, String omistaja, int lasti) { super(rekisteriNumero, omistaja); this.kantavuus = lasti; 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 0c5fb2a608860ddf2225d92690eafd616fb4c96c..61e79b16205b8fba546539c3d87affcaa02cd8b4 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java @@ -5,24 +5,51 @@ import java.util.HashMap; import java.util.HashSet; public class Main { + public static void main(String[] args) { - /** - * Main class. - * - * @param args Command line arguments - */ + Kirja k1 = new Kirja( + "Kirja 1", + "kirjailija", + 2020 + ); - public static void main(String[] args) { - /* - * Testin jälkeen alla olevan rivin voi joko kommentoida tai poistaa. - */ - System.out.println("*** Harjoitustyöpohja käynnistyy ***"); + Kirja k2 = new Kirja( + "Kirja 2", + "kirjailija", + 2020 + ); + + KirjaKokoelma kokoelma = new KirjaKokoelma( + "hyvät kirjat" + ); + + + Kirjasto turunKirjasto = new Kirjasto( + "Turun pääkirjasto", + "Linnankatu 2" + ); + + Kirjasto turunKirjastoAuto = new Kirjasto( + "Turun kirjastoauto", + "vaihteleva" + ); + + Kirjasto salonKirjasto = new Kirjasto( + "Salon pääkirjasto", + "Keskusta" + ); + + kokoelma.lisaaKirja(k1); + kokoelma.lisaaKirja(k2); + turunKirjasto.lisaaKokoelma(kokoelma); + salonKirjasto.lisaaKokoelma(kokoelma); + turunKirjasto.lisaaSivukirjasto(salonKirjasto); + turunKirjasto.lisaaSivukirjasto(turunKirjastoAuto); - HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); - HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>(); - HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>(); + System.out.println(turunKirjasto.equals(turunKirjasto.clone())); + System.out.print(turunKirjasto.toString()); } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava5.txt b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava5.txt new file mode 100644 index 0000000000000000000000000000000000000000..c0f4ead2d726b9dd6f14ae880106989ea5006529 --- /dev/null +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava5.txt @@ -0,0 +1,26 @@ +A) + +Palautettu lista on tyyppiä "Set<Z>". Metodissa tyyppiparametri "Z" on rajoitettu niin, että se laajenee "Ajoneuvo"-luokan alatyypeiksi. +Tämä tarkoittaa sitä, että kaikki "Ajoneuvo"-luokan alatyypit ovat yhteensopivia tyyppiin "Z". Näin ollen "Set<Ajoneuvo>", "Set<HenkiloAuto>" ja "Set<KuormaAuto>" ovat kaikki yhteensopivia. + +B) + +Henkilöautot ja kuorma-autot voidaan lisätä ajoneuvot-nimiseen listaan, koska ne perivät Ajoneuvo-luokan. +Tämä on mahdollista, koska periytymisen ansiosta alatyypit ovat yhteensopivia ylätyypin kanssa. + +HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); +HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>(); +HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>(); + +// Tämä ONNISTUU +ajoneuvot.addAll(henkiloautot); +ajoneuvot.addAll(kuormaautot); + +Kuitenkin, et voi sijoittaa henkiloautot-listaa suoraan ajoneuvot-muuttujaan, koska muuttujan ajoneuvot tyyppi ei ole määritelty polymorfisesti yläluokan Ajoneuvo kanssa. + +// Tätä EI voi tehdä +ajoneuvot = henkiloautot; + +Jos haluat sijoittaa henkiloautot-listan viittauksen ajoneuvot-muuttujaan, sinun tulee määritellä ajoneuvot-muuttuja siten, että se hyväksyy tyyppirajoituksen. +HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); +