Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Deque-Tietorakenne Javassa | Osio
Javan Perustietorakenteet

Deque-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

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

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

Koska Deque on kaksipäinen jono (double-ended queue), eli voit käsitellä alkioita sekä jonon alusta että lopusta, 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

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 huomaat, 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äämismetodeja jonon alkuun ja loppuun, täytyy olla myös poistometodeja jonon alusta ja lopusta.

  • 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

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 voidaan tarkastella deque-rakenteen alkioita.

  • getFirst(): hakee, mutta ei poista, ensimmäisen alkion deque-rakenteen alusta;
  • getLast(): hakee, mutta ei poista, viimeisen alkion deque-rakenteen lopusta.

Näin voimme tarkastella ensimmäistä ja viimeistä alkiota kaksoispäätejonossa.

Tarkastellaanpa seuraavaksi esimerkkiä koodissa:

Main.java

Main.java

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); } }

Käyttämällä getFirst()- ja getLast()-metodeja haettiin dequen ensimmäinen ja viimeinen alkio ja asetettiin 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

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, koska ymmärrät jo näiden metodien toiminnan, 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 ole mahdollista;
  • offerLast(E e): lisää alkion dequen loppuun, jos mahdollista, ja palauttaa true. Palauttaa false, jos lisääminen ei ole mahdollista;
  • 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, jonon viimeistä alkiota Deque-rakenteessa?

question mark

Mitä "Deque" tarkoittaa?

Valitse oikea vastaus

question mark

Mikä Java-rajapinta edustaa Deque-rakennetta?

Valitse oikea vastaus

question mark

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

Valitse oikea vastaus

question mark

Millä metodilla haetaan, mutta ei poisteta, jonon viimeistä alkiota Deque-rakenteessa?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 10

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Osio 1. Luku 10
some-alt