Skip to content
Snippets Groups Projects
Commit bf3c4465 authored by NikoItanen's avatar NikoItanen
Browse files

Tehtävä 1 ja 2 tehty!

Tehtävä 1 ja 2 tehty!
parent 8a8bc36d
No related branches found
No related tags found
No related merge requests found
Tehtava 1:
A. Collection ja Map
Collection on rajapinta tai luokkaryhmä, joka on joukko erilaisia objekteja tai elementtejä. Sillä on toiminnallisuuksia, kuten elementtien lisääminen, poistaminen, hakeminen
sekä iterointi.
Tallentaminen (lisääminen) ja käsittely on yksi käyttötapa Collectionilla, joka mahdollistaa dynaamisen lisäämisen, poistamisen sekä hakemisen eri elementeille.
Iteroiminen on myös Collectionin tarjoama käyttötapa, jossa käydään läpi sen kaikki elementit ja näin elementeille voidaan suorittaa tarvittavia toimintoja.
Collectionin avulla voidaan myös järjestää ja suodattaa kokoelmia niiden elementtien ominaisuuksien perusteella.
Map on luokka, joka mahdollistaa avain-arvo-parien kokoelmia. Jokaisella arvolla on olemassa sille uniikki avain, jonka avulla siihen on mahdollista viitata ja täten hakea.
Map tarjoaa keinon tallentaa, hakea sekä päivittää tietoa avain-arvo-parien pareina.
Map soveltuu hyvin tilanteisiin, joissa halutaan liittää tietoa avainten perusteella, kuten esimerkiksi hakemistoissa sekä tietokannoissa, joissa avain voisi esimerkiksi olla
henkilön nimi tai jokin muu tunniste.
Map tarjoaa myös erittäin helpon tapan hakea tietoa. Sen toteutus hyödyntää usein hajautusfunktioita, joka mahdollistaa datan haun suuristakin datamääristä.
Uniikkien avaimien vuoksi Map on hyödyllinen silloin kun tarvitaan yksilöllistä tunnistetta tai viittausta johonkin.
Yhteenvetona voidaan todeta, että Collection on yleinen tietorakenne, joka mahdollistaa elementtien tallentamisen, käsittelyn ja iteroinnin.
Map sen sijaan keskittyy avain-arvo -parien tallentamiseen ja tehokkaaseen tiedon hakemiseen avaimen perusteella.
Käyttötarkoitukset vaihtelevat sen mukaan, miten ja millaisia tietoja halutaan tallentaa ja käsitellä.
B. List, Set ja Queue
Luokat "List", "Set" ja "Queue" ovat erilaisia tietorakenteita, joita kaikkia voidaan käyttää tietojen tallentamiseen ja käsittelyyn Java-ohjelmoinnissa.
List:
List on luokka, joka mahdollistaa objektien kokoelmien järjestelyyn ratkaisun. Listassa voi olla elementtejä, jotka saattavat esiintyä useita kertoja, ja niiden olemassa olo on
määritelty järjestykseen niiden lisäämisjärjestyksessä. Listoissa voi olla päällekkäisiä sekä toistuvia elementtejä. List-luokalla on toteutuksia kuten: ArrayList, LinkedList sekä Vector
Listan käyttötarkoitukset ovat elementtien tallentaminen ja järjestyksen hallinta tietyssä järjestyksessä, indeksointi jokaiselle elementille, joka mahdollistaa elementin haun sekä
Iterointi, jolla voidaan käydä läpi ja siorittaa toimintoja jokaiselle elementille sen indeksin avulla.
Set:
Set on puolestaan luokka, joka mahdollistaa elementtien kokoelmien olemassa olon ilman erikseen määriteltyä järjestystä. Set ei puolestaan listaan verraten salli päälleikkäysiiksiä
elementtien osalta, jonka takia yksi elementti voidaan lisätä siihen vain yhden kerran.
Set luokan käyttötarkoituksia ovat muun muassa uniikkien elementtien tallentaminen säilyttäen vain yksilölliset elementit ilman mahdollisia duplikaatteja. Set luokalla voidaan myös
toteuttaa erilaisia joukkoon perustuvia matemaattisia operaatioita kuten unioni, leikkaus sekä erotus.
Queue:
Queue on luokka, joka mahdollistaa nimensä mukaisesti jonon tapaisia kokoelmia. Queue toimii FIFO-periaatteella, eli ensimmäisenä sisään, ensimmäisenä ulos.
Elementit siis poistetaan järjestyksestä niiden lisäämisjärjestyksen perusteella.
Queue luokan käyttötarkoituksia ovat joukkosen jonotus sekä tiedon kerääminen ja jakaminen. Queue soveltuu tilanteisiin, joissa tarvitaan järjestyksessä tapahtuvaa prosessointia
kuten tehtävien käsittelyä jonossa.
Lisäksi Queuea voidaan käyttää tiedonsiirrossa, jossa tietoa kerätään ja jaetaan sitä tarvitseville osallisille järjestyksessä.
Täten voidaan todeta, että List tarjoaa järjestetyn tietorakenteen, jossa on indeksointi,
Set mahdollistaa uniikkien elementtien tallennuksen ja joukko-operaatiot, kun taas Queue tarjoaa järjestyksessä tapahtuvaa prosessointia.
Käyttötarkoitukset vaihtelevat jälleen kerran sen mukaan, millaisia tietoja halutaan tallentaa ja millä tavalla niitä käsitellän.
C. ArrayList ja LinkedList
ArrayList on dynaaminen taulukkoon perustuva tietorakenne, joka tallentaa elementit peräkkäisiin indekseihin. ArrayList tarjoaa keinon satunnaiseen elementtien pääsyyn ja on hyödyllinen,
kun tiedetään indeksi ja halutaan nopeasti lisätä tai poistaa elementtejä listan lopusta. ArrayList tukee myös dynaamista koon kasvattamista tarvittaessa.
ArrayList on paras ratkaisu silloin, kun tiedetään, että kokoelman keskeltä ei tarvitse poistaa elementtejä tai lisätä niitä.
LinkedList on linkitetty tietorakenne, jossa jokaisella elementillä on viittaus siitä seuraavaan ja/tai edelliseen elementtiin.
Toisin kuin ArrayList, LinkedList ei tallenna elementtejä peräkkäisiin indekseihin, vaan ne voivat olla hajallaan.
Tämä mahdollistaa tehokkaan lisäämisen ja poistamisen listan keskeltä, mutta puolestaan satunnainen pääsy elementteihin vaatii koko listan läpikäyntiä.
Voidaan siis todeta, että ArrayList on hyvä valinta, kun tarvitaan nopeaa satunnaista pääsyä elementteihin ja tehokasta lisäämistä ja poistamista listan lopusta.
LinkedList puolestaan sopii tilanteisiin, joissa tarvitaan tehokasta lisäämistä ja poistamista listan keskeltä sekä hyvää suorituskykyä iteroinnissa.
D. HashSet ja TreeSet
HashSet on avain-arvo-pareja hyödyntävä rakenne, joka tallentaa uniikkeja elementtejä ilman määrättyä järjestystä.
Se perustuu hajautustaulun toteutukseen, jossa elementtien tallennuspaikka määräytyy niiden hajautusfunktion avulla.
HashSet sopii hyvin tilanteisiin, joissa halutaan pitää vain yksilölliset elementit ja poistaa täten mahdolliset duplikaatit.
HashSet tarjoaa nopean elementtien lisäyksen, poiston ja tarkistamisen operaatiot. Koska HashSet ei säilytä järjestystä, elementit voivat palautua eri järjestyksessä kuin ne lisättiinkin.
TreeSet on tietorakenne, joka tallentaa uniikkeja elementtejä järjestetyssä muodossa. Se käyttää niin sanottua puurakennetta järjestääkseen sen kaikki elementit.
TreeSet varmistaa myös, että elementit palautetaan tietyssä järjestyksessä, joka voi olla sen luonnollinen järjestys tai määritetty järjestys Comparatorin avulla.
Lisäksi TreeSet tarjoaa tehokkaita toimintoja, kuten aluehakuja ja järjestysperusteisia operaatioita.
Näin todetaankin siis, että HashSet sopii hyvin tilanteisiin, joissa halutaan pitää uniikkeja elementtejä nopeasti lisäämällä, poistamalla ja tarkistamalla.
TreeSet puolestaan tarjoaa järjestettyä tallennusta ja järjestysoperaatioita, mikä tekee siitä hyvän valinnan, kun elementtien on oltava tietyssä järjestyksessä
tai esimerkiksi kun tarvitaan järjestysperusteisia hakutoimintoja.
\ No newline at end of file
package fi.utu.tech.ooj.exercise3;
public class Kirja {
import java.util.Objects;
public class Kirja implements Cloneable {
private String kirjanNimi;
private String kirjailijanNimi;
private int julkaisuVuosi;
......@@ -35,5 +37,36 @@ public class Kirja {
this.julkaisuVuosi = julkaisuVuosi;
}
@Override
public Kirja clone() {
try {
return (Kirja) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
@Override
public String toString() {
return "Kirjan nimi: " + kirjanNimi +
", Kirjailijan nimi: " + kirjailijanNimi +
", Julkaisuvuosi: " + julkaisuVuosi;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Kirja other = (Kirja) obj;
return julkaisuVuosi == other.julkaisuVuosi &&
Objects.equals(kirjanNimi, other.kirjanNimi) &&
Objects.equals(kirjailijanNimi, other.kirjailijanNimi);
}
}
......@@ -3,8 +3,9 @@ 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 {
public class KirjaKokoelma implements Cloneable {
private String kokoelmanNimi;
private ArrayList<Kirja>kirjaListaus;
......@@ -30,4 +31,49 @@ public class KirjaKokoelma {
kirjaListaus.add(teos);
}
@Override
public KirjaKokoelma clone() {
try {
KirjaKokoelma cloned = (KirjaKokoelma) super.clone();
//Syväkopiointi kirjalistaukselle
cloned.kirjaListaus = new ArrayList<>();
for (Kirja kirja : kirjaListaus) {
cloned.kirjaListaus.add(kirja.clone());
}
return cloned;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Kokoelman nimi: ").append(kokoelmanNimi).append("\n");
sb.append("Kirjat: \n");
for (Kirja kirja : kirjaListaus) {
sb.append(kirja.toString()).append("\n");
}
return sb.toString();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
KirjaKokoelma other = (KirjaKokoelma) obj;
return Objects.equals(kokoelmanNimi, other.kokoelmanNimi) &&
Objects.equals(kirjaListaus, other.kirjaListaus);
}
}
......@@ -4,8 +4,9 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Objects;
public class Kirjasto {
public class Kirjasto implements Cloneable {
private String kirjastonNimi;
private String osoite;
......@@ -57,5 +58,64 @@ public class Kirjasto {
sivukirjastot.add(input);
}
@Override
public Kirjasto clone() {
try {
Kirjasto cloned = (Kirjasto) super.clone();
//Syväkopiointi sivukirjastoille
cloned.sivukirjastot = new HashSet<>();
for(Kirjasto sivuKirjasto : sivukirjastot) {
cloned.sivukirjastot.add(sivuKirjasto.clone());
}
//Syväkopiointi kirjakokoelmille
cloned.kokoelmat = new ArrayList<>();
for(KirjaKokoelma kokoelma : kokoelmat) {
cloned.kokoelmat.add(kokoelma.clone());
}
return cloned;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Kirjaston nimi: ").append(kirjastonNimi).append("\n");
sb.append("Osoite: ").append(osoite).append("\n");
sb.append("Kirjakokoelmat: \n");
for (KirjaKokoelma kokoelma : kokoelmat) {
sb.append(kokoelma.toString()).append("\n");
}
sb.append("Sivukirjastot: \n");
for (Kirjasto sivukirjasto : sivukirjastot) {
sb.append(sivukirjasto.toString()).append("\n");
}
return sb.toString();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Kirjasto other = (Kirjasto) obj;
return Objects.equals(kirjastonNimi, other.kirjastonNimi) &&
Objects.equals(osoite, other.osoite) &&
Objects.equals(kokoelmat, other.kokoelmat) &&
Objects.equals(sivukirjastot, other.sivukirjastot);
}
}
......@@ -20,9 +20,54 @@ public class Main {
*/
System.out.println("*** Harjoitustyöpohja käynnistyy ***");
HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>();
HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>();
HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>();
Kirjasto paakirjasto = new Kirjasto("Turun pääkirjasto", "Turku");
Kirjasto sivukirjasto1 = new Kirjasto("Sivukirjasto 1", "Turku");
Kirjasto sivukirjasto2 = new Kirjasto("Sivukirjasto 2", "Turku");
paakirjasto.lisaaSivukirjasto(sivukirjasto1);
paakirjasto.lisaaSivukirjasto(sivukirjasto2);
KirjaKokoelma kokoelma1 = new KirjaKokoelma("Kaunokirjallisuus");
KirjaKokoelma kokoelma2 = new KirjaKokoelma("Tietokirjat");
KirjaKokoelma kokoelma3 = new KirjaKokoelma("Lastenkirjat");
KirjaKokoelma kokoelma4 = new KirjaKokoelma("Romantiikka");
KirjaKokoelma kokoelma5 = new KirjaKokoelma("Jännitys");
KirjaKokoelma kokoelma6 = new KirjaKokoelma("Klassikot");
paakirjasto.lisaaKokoelma(kokoelma1);
paakirjasto.lisaaKokoelma(kokoelma2);
sivukirjasto1.lisaaKokoelma(kokoelma3);
sivukirjasto1.lisaaKokoelma(kokoelma4);
sivukirjasto2.lisaaKokoelma(kokoelma5);
sivukirjasto2.lisaaKokoelma(kokoelma6);
Kirja kirja1 = new Kirja("Kirja 1", "Kirjailija 1", 2000);
Kirja kirja2 = new Kirja("Kirja 2", "Kirjailija 2", 2010);
Kirja kirja3 = new Kirja("Kirja 3", "Kirjailija 3", 1995);
Kirja kirja4 = new Kirja("Kirja 4", "Kirjailija 4", 2020);
Kirja kirja5 = new Kirja("Kirja 5", "Kirjailija 5", 2005);
Kirja kirja6 = new Kirja("Kirja 6", "Kirjailija 6", 1985);
kokoelma1.lisaaKirja(kirja1);
kokoelma1.lisaaKirja(kirja2);
kokoelma2.lisaaKirja(kirja3);
kokoelma2.lisaaKirja(kirja4);
kokoelma3.lisaaKirja(kirja5);
kokoelma3.lisaaKirja(kirja6);
System.out.println(paakirjasto.toString());
Kirjasto kopio = (Kirjasto) paakirjasto.clone();
//Kun alla oleva rivi suoritetaan, niin huomataan, että oliot eivät ole samat. Tämä johtuu siitä, että näiden olioiden muistipaikat ovat eriävät ja eivät ole tästä syystä samat.
System.out.println("Alkuperäinen kirjasto ja sen kopio ovat samat: " + paakirjasto.equals(kopio));
// HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>();
// HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>();
// HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment