Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Deque-Tietorakenne Javassa | Edistyneet Tietorakenteet Javassa
Java-tietorakenteet

bookDeque-Tietorakenne Javassa

Kaksipäinen jono

Deque eli kaksipäinen jono mahdollistaa jonon käsittelyn sekä alusta että lopusta.

Deque-rajapinta laajentaa Queue-rajapintaa, joten esimerkiksi LinkedList-luokka toteuttaa myös tämän rajapinnan.

Tämän vuoksi käytät jälleen LinkedList-luokkaa, mutta tällä kertaa uudella rajapinnalla.

Oliomuuttujan määrittely Deque-tyyppisenä ei eroa Queue-tyyppisestä:

Main.java

Main.java

copy
1
Deque<T> deque = new LinkedList<>();

Pääasiallinen ero tulee esiin, kun tarkastellaan tämän rajapinnan metodeja.

Koska Deque on kaksipäinen jono, eli voit käsitellä alkioita sekä jonon alussa että lopussa, sen metodit ovat räätälöityjä tätä ominaisuutta varten.

Metodit

Joitakin Deque-rajapinnan keskeisiä metodeja ovat:

  • addFirst(element): lisää alkion dequeen alkuun;
  • addLast(element): lisää alkion dequeen loppuun.

On selvää, että deque-rakenteessa on metodit alkion lisäämiseksi alkuun ja loppuun. Näiden metodien nimet ovat itseään selittäviä. Tarkastellaan näitä metodeja koodissa:

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }

Kuten näet, addFirst()-metodin käytön jälkeen alkio lisättiin jonon alkuun. Tämä erottaa sen addLast()-metodista.

Deque-rajapinnassa on myös tavallinen add()-metodi, joka toimii samalla tavalla kuin addLast()-metodi. Siksi on täysin sinun päätettävissäsi, kumpaa metodia käytät.

Poistometodit

Jos on olemassa alkioiden lisäämiseen alkuun ja loppuun tarkoitettuja metodeja, tulee olla myös alkioiden poistamiseen alku- ja loppupäästä tarkoitettuja metodeja.

  • removeFirst(): poistaa ja palauttaa alkion jonon alusta;
  • removeLast(): poistaa ja palauttaa alkion jonon lopusta.

addFirst()- ja addLast()-metodit suorittavat alkioiden poistamisen jonon alusta ja lopusta.

Tarkastellaan esimerkkiä käytöstä koodissa:

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }

Kuten näet, poistimme ensimmäisen ja viimeisen alkion deque-rakenteesta, jolloin vain toinen alkio jäi jäljelle.

Tämä on yksinkertaista ja kätevää, ja metodien nimet kertovat itse tarkoituksensa.

Hakuun liittyvät metodit

Seuraavaksi siirrytään menetelmiin, joilla haetaan alkioita deque-rakenteesta.

  • getFirst(): hakee, mutta ei poista, jonon alussa olevan alkion;
  • getLast(): hakee, mutta ei poista, jonon lopussa olevan alkion.

Näin voimme hakea ensimmäisen ja viimeisen alkion kaksipäisestä jonosta.

Tarkastellaan nyt esimerkkiä koodissa:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }

getFirst()- ja getLast()-metodeilla haettiin ensimmäinen ja viimeinen alkio deque-rakenteesta ja tallennettiin ne uusiin muuttujiiin.

Deque-rajapinnassa on myös peekFirst()- ja peekLast()-metodit, jotka ratkaisevat poikkeuksen heittämiseen liittyvän ongelman. Sen sijaan, että ne heittäisivät poikkeuksen ja pysäyttäisivät ohjelman, ne palauttavat null, jos jono on tyhjä.

Tarkastellaan esimerkkiä:

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }

Tästä esimerkistä kävi ilmi, että on paljon parempi käyttää peekFirst()- ja peekLast()-metodeja kuin getFirst()- ja getLast()-metodeja, koska ne eivät pysäytä ohjelmaa virheen sattuessa.

Älä kuitenkaan unohda NullPointerException-poikkeusta! Tämä poikkeus voi aiheuttaa monia ongelmia ohjelmassasi.

On olemassa myös vastaavat vaihtoehtoiset metodit metodeille addFirst(), addLast(), removeFirst() ja removeLast(). Emme käsittele niitä tarkemmin, sillä ymmärrät jo näiden toimintaperiaatteen, mutta tässä on lista:

Vaihtoehtoiset metodit

Metodit alkioon lisäämiseksi dequeen:

  • offerFirst(E e): lisää alkion dequen alkuun, jos mahdollista, ja palauttaa true. Palauttaa false, jos lisääminen ei onnistu;
  • offerLast(E e): lisää alkion dequen loppuun, jos mahdollista, ja palauttaa true. Palauttaa false, jos lisääminen ei onnistu;
  • push(E e): lisää alkion dequen alkuun, kuten addFirst(). Huomaa, että push() on myös pino-metodi Deque-luokassa.

Metodit alkion poistamiseksi dequeesta:

  • pollFirst(): poistaa ja palauttaa ensimmäisen alkion dequeesta. Palauttaa null, jos deque on tyhjä;
  • pollLast(): poistaa ja palauttaa viimeisen alkion dequeesta. Palauttaa null, jos deque on tyhjä;
  • pop(): poistaa ja palauttaa ensimmäisen alkion dequeesta, kuten removeFirst().

Valinta riippuu ohjelman vaatimuksista. Kaiken voi aina ratkaista tavallisella taulukolla, mutta se olisi melko haastavaa eikä optimoitua. Siksi on olemassa niin monia erilaisia tietorakenteita—jotta erilaisten ohjelmien kirjoittaminen olisi helpompaa.

1. Mitä "Deque" tarkoittaa?

2. Mikä Java-rajapinta edustaa Deque-rakennetta?

3. Mikä on addFirst()-metodin tarkoitus Deque-rakenteessa?

4. Millä metodilla haetaan, mutta ei poisteta, deque-rakenteen viimeistä alkiota?

question mark

Mitä "Deque" tarkoittaa?

Select the correct answer

question mark

Mikä Java-rajapinta edustaa Deque-rakennetta?

Select the correct answer

question mark

Mikä on addFirst()-metodin tarkoitus Deque-rakenteessa?

Select the correct answer

question mark

Millä metodilla haetaan, mutta ei poisteta, deque-rakenteen viimeistä alkiota?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

bookDeque-Tietorakenne Javassa

Pyyhkäise näyttääksesi valikon

Kaksipäinen jono

Deque eli kaksipäinen jono mahdollistaa jonon käsittelyn sekä alusta että lopusta.

Deque-rajapinta laajentaa Queue-rajapintaa, joten esimerkiksi LinkedList-luokka toteuttaa myös tämän rajapinnan.

Tämän vuoksi käytät jälleen LinkedList-luokkaa, mutta tällä kertaa uudella rajapinnalla.

Oliomuuttujan määrittely Deque-tyyppisenä ei eroa Queue-tyyppisestä:

Main.java

Main.java

copy
1
Deque<T> deque = new LinkedList<>();

Pääasiallinen ero tulee esiin, kun tarkastellaan tämän rajapinnan metodeja.

Koska Deque on kaksipäinen jono, eli voit käsitellä alkioita sekä jonon alussa että lopussa, sen metodit ovat räätälöityjä tätä ominaisuutta varten.

Metodit

Joitakin Deque-rajapinnan keskeisiä metodeja ovat:

  • addFirst(element): lisää alkion dequeen alkuun;
  • addLast(element): lisää alkion dequeen loppuun.

On selvää, että deque-rakenteessa on metodit alkion lisäämiseksi alkuun ja loppuun. Näiden metodien nimet ovat itseään selittäviä. Tarkastellaan näitä metodeja koodissa:

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }

Kuten näet, addFirst()-metodin käytön jälkeen alkio lisättiin jonon alkuun. Tämä erottaa sen addLast()-metodista.

Deque-rajapinnassa on myös tavallinen add()-metodi, joka toimii samalla tavalla kuin addLast()-metodi. Siksi on täysin sinun päätettävissäsi, kumpaa metodia käytät.

Poistometodit

Jos on olemassa alkioiden lisäämiseen alkuun ja loppuun tarkoitettuja metodeja, tulee olla myös alkioiden poistamiseen alku- ja loppupäästä tarkoitettuja metodeja.

  • removeFirst(): poistaa ja palauttaa alkion jonon alusta;
  • removeLast(): poistaa ja palauttaa alkion jonon lopusta.

addFirst()- ja addLast()-metodit suorittavat alkioiden poistamisen jonon alusta ja lopusta.

Tarkastellaan esimerkkiä käytöstä koodissa:

Main.java

Main.java

copy
1234567891011121314151617
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }

Kuten näet, poistimme ensimmäisen ja viimeisen alkion deque-rakenteesta, jolloin vain toinen alkio jäi jäljelle.

Tämä on yksinkertaista ja kätevää, ja metodien nimet kertovat itse tarkoituksensa.

Hakuun liittyvät metodit

Seuraavaksi siirrytään menetelmiin, joilla haetaan alkioita deque-rakenteesta.

  • getFirst(): hakee, mutta ei poista, jonon alussa olevan alkion;
  • getLast(): hakee, mutta ei poista, jonon lopussa olevan alkion.

Näin voimme hakea ensimmäisen ja viimeisen alkion kaksipäisestä jonosta.

Tarkastellaan nyt esimerkkiä koodissa:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }

getFirst()- ja getLast()-metodeilla haettiin ensimmäinen ja viimeinen alkio deque-rakenteesta ja tallennettiin ne uusiin muuttujiiin.

Deque-rajapinnassa on myös peekFirst()- ja peekLast()-metodit, jotka ratkaisevat poikkeuksen heittämiseen liittyvän ongelman. Sen sijaan, että ne heittäisivät poikkeuksen ja pysäyttäisivät ohjelman, ne palauttavat null, jos jono on tyhjä.

Tarkastellaan esimerkkiä:

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }

Tästä esimerkistä kävi ilmi, että on paljon parempi käyttää peekFirst()- ja peekLast()-metodeja kuin getFirst()- ja getLast()-metodeja, koska ne eivät pysäytä ohjelmaa virheen sattuessa.

Älä kuitenkaan unohda NullPointerException-poikkeusta! Tämä poikkeus voi aiheuttaa monia ongelmia ohjelmassasi.

On olemassa myös vastaavat vaihtoehtoiset metodit metodeille addFirst(), addLast(), removeFirst() ja removeLast(). Emme käsittele niitä tarkemmin, sillä ymmärrät jo näiden toimintaperiaatteen, mutta tässä on lista:

Vaihtoehtoiset metodit

Metodit alkioon lisäämiseksi dequeen:

  • offerFirst(E e): lisää alkion dequen alkuun, jos mahdollista, ja palauttaa true. Palauttaa false, jos lisääminen ei onnistu;
  • offerLast(E e): lisää alkion dequen loppuun, jos mahdollista, ja palauttaa true. Palauttaa false, jos lisääminen ei onnistu;
  • push(E e): lisää alkion dequen alkuun, kuten addFirst(). Huomaa, että push() on myös pino-metodi Deque-luokassa.

Metodit alkion poistamiseksi dequeesta:

  • pollFirst(): poistaa ja palauttaa ensimmäisen alkion dequeesta. Palauttaa null, jos deque on tyhjä;
  • pollLast(): poistaa ja palauttaa viimeisen alkion dequeesta. Palauttaa null, jos deque on tyhjä;
  • pop(): poistaa ja palauttaa ensimmäisen alkion dequeesta, kuten removeFirst().

Valinta riippuu ohjelman vaatimuksista. Kaiken voi aina ratkaista tavallisella taulukolla, mutta se olisi melko haastavaa eikä optimoitua. Siksi on olemassa niin monia erilaisia tietorakenteita—jotta erilaisten ohjelmien kirjoittaminen olisi helpompaa.

1. Mitä "Deque" tarkoittaa?

2. Mikä Java-rajapinta edustaa Deque-rakennetta?

3. Mikä on addFirst()-metodin tarkoitus Deque-rakenteessa?

4. Millä metodilla haetaan, mutta ei poisteta, deque-rakenteen viimeistä alkiota?

question mark

Mitä "Deque" tarkoittaa?

Select the correct answer

question mark

Mikä Java-rajapinta edustaa Deque-rakennetta?

Select the correct answer

question mark

Mikä on addFirst()-metodin tarkoitus Deque-rakenteessa?

Select the correct answer

question mark

Millä metodilla haetaan, mutta ei poisteta, deque-rakenteen viimeistä alkiota?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 2
some-alt