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
1Deque<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
123456789101112131415package 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
1234567891011121314151617package 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
123456789101112131415161718package 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
123456789101112131415package 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 palauttaatrue. Palauttaafalse, jos lisääminen ei ole mahdollista;offerLast(E e): lisää alkion dequen loppuun, jos mahdollista, ja palauttaatrue. Palauttaafalse, jos lisääminen ei ole mahdollista;push(E e): lisää alkion dequen alkuun, kutenaddFirst(). Huomaa, ettäpush()on myös pino-metodiDeque-luokassa.
Metodit alkion poistamiseksi dequeesta:
pollFirst(): poistaa ja palauttaa ensimmäisen alkion dequeesta. Palauttaanull, jos deque on tyhjä;pollLast(): poistaa ja palauttaa viimeisen alkion dequeesta. Palauttaanull, jos deque on tyhjä;pop(): poistaa ja palauttaa ensimmäisen alkion dequeesta, kutenremoveFirst().
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?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme