Deque-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
1Deque<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
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 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
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 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
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); } }
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
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, 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 palauttaatrue. Palauttaafalse, jos lisääminen ei onnistu;offerLast(E e): lisää alkion dequen loppuun, jos mahdollista, ja palauttaatrue. Palauttaafalse, jos lisääminen ei onnistu;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, deque-rakenteen viimeistä alkiota?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 4
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, 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
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 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
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 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
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); } }
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
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, 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 palauttaatrue. Palauttaafalse, jos lisääminen ei onnistu;offerLast(E e): lisää alkion dequen loppuun, jos mahdollista, ja palauttaatrue. Palauttaafalse, jos lisääminen ei onnistu;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, deque-rakenteen viimeistä alkiota?
Kiitos palautteestasi!