Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Deque-datastruktur i Java | Avancerade Datastrukturer i Java
Java Datastrukturer

bookDeque-datastruktur i Java

Dubbeländad kö

Deque, eller dubbeländad kö, möjliggör hantering av köer från både fram- och baksidan.

Deque-gränssnittet utökar Queue-gränssnittet, så en klass som LinkedList implementerar även detta gränssnitt.

Du kommer därför återigen att använda LinkedList, men denna gång med ett nytt gränssnitt.

Deklaration av ett objekt med typen Deque skiljer sig inte från Queue:

Main.java

Main.java

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

Den viktigaste skillnaden uppstår när vi går vidare till metoderna för detta gränssnitt.

Eftersom en Deque är en dubbeländad kö, vilket innebär att du kan arbeta med element både i början och slutet av kön, är dess metoder anpassade för denna egenskap.

Metoder

Några viktiga metoder i Deque-gränssnittet är:

  • addFirst(element): lägger till ett element i början av deque;
  • addLast(element): lägger till ett element i slutet av deque.

Det är tydligt att det i en deque finns metoder för att lägga till i början och slutet. Namnen på dessa metoder är självförklarande. Låt oss titta på dessa metoder i kod:

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

Som du kan se, efter att ha använt metoden addFirst(), lades elementet till i början av deque. Detta skiljer sig från metoden addLast().

Deque har också en vanlig metod add(), som fungerar på samma sätt som metoden addLast(). Därför är valet av metod helt upp till dig.

Borttagningsmetoder

Om det finns metoder för att lägga till element i början och slutet, bör det också finnas metoder för att ta bort från början och slutet av deque.

  • removeFirst(): tar bort och returnerar elementet från början av deque;
  • removeLast(): tar bort och returnerar elementet från slutet av deque.

Metoderna addFirst() och addLast() utför borttagning av element från början och slutet av deque.

Låt oss titta på ett exempel på användning i koden:

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

Som du kan se har vi tagit bort det första och sista elementet från deque, vilket lämnar endast det andra elementet kvar.

Det är enkelt och bekvämt, och metodnamnen talar för sig själva.

Åtkomstmetoder

Nästa steg är att gå vidare till metoder för åtkomst till element i en deque.

  • getFirst(): hämtar, men tar inte bort, elementet i början av deque;
  • getLast(): hämtar, men tar inte bort, elementet i slutet av deque.

Detta gör det möjligt att komma åt första och sista elementet i en dubbelriktad kö.

Nu ska vi titta på ett kodexempel:

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

Med hjälp av metoderna getFirst() och getLast() hämtades de första och sista elementen från deque-strukturen och tilldelades nyss skapade variabler.

I Deque-gränssnittet finns även metoderna peekFirst() och peekLast(), vilka hanterar problemet med att kasta ett undantag. Istället för att kasta ett undantag och stoppa programmet returnerar de null om kön är tom.

Låt oss titta på ett exempel:

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

Från detta exempel blev det tydligt att det är mycket bättre att använda metoderna peekFirst() och peekLast() istället för getFirst() och getLast(), eftersom de inte stoppar programmet vid ett fel.

Glöm dock inte bort NullPointerException! Detta undantag kan orsaka många problem i ditt program.

Det finns också motsvarande alternativa metoder för metoderna addFirst(), addLast(), removeFirst() och removeLast(). Vi kommer inte att uppehålla oss vid dem länge, eftersom du redan förstår hur dessa metoder fungerar, men här är listan:

Alternativa metoder

Metoder för att lägga till ett element i deque:

  • offerFirst(E e): lägger till ett element i början av deque, om möjligt, och returnerar true. Returnerar false om tillägg inte är möjligt;
  • offerLast(E e): lägger till ett element i slutet av deque, om möjligt, och returnerar true. Returnerar false om tillägg inte är möjligt;
  • push(E e): lägger till ett element i början av deque, liknande addFirst(). Observera att push() också är en stackmetod i klassen Deque.

Metoder för att ta bort ett element från deque:

  • pollFirst(): tar bort och returnerar det första elementet i deque. Returnerar null om deque är tom;
  • pollLast(): tar bort och returnerar det sista elementet i deque. Returnerar null om deque är tom;
  • pop(): tar bort och returnerar det första elementet i deque, liknande removeFirst().

Valet beror på programmets krav. Du kan alltid lösa allt med en vanlig array, men det skulle vara ganska utmanande och inte optimerat. Det är därför så många olika datastrukturer finns—för att göra det mer bekvämt att skriva olika program.

1. Vad står "Deque" för?

2. Vilket gränssnitt i Java representerar en Deque?

3. Vad är syftet med metoden addFirst() i en Deque?

4. Vilken metod används för att hämta, men inte ta bort, det sista elementet i en Deque?

question mark

Vad står "Deque" för?

Select the correct answer

question mark

Vilket gränssnitt i Java representerar en Deque?

Select the correct answer

question mark

Vad är syftet med metoden addFirst() i en Deque?

Select the correct answer

question mark

Vilken metod används för att hämta, men inte ta bort, det sista elementet i en Deque?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

What are some real-world use cases for a Deque?

Can you explain the difference between a Deque and a regular Queue?

How do I choose between using addFirst/addLast and offerFirst/offerLast?

bookDeque-datastruktur i Java

Svep för att visa menyn

Dubbeländad kö

Deque, eller dubbeländad kö, möjliggör hantering av köer från både fram- och baksidan.

Deque-gränssnittet utökar Queue-gränssnittet, så en klass som LinkedList implementerar även detta gränssnitt.

Du kommer därför återigen att använda LinkedList, men denna gång med ett nytt gränssnitt.

Deklaration av ett objekt med typen Deque skiljer sig inte från Queue:

Main.java

Main.java

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

Den viktigaste skillnaden uppstår när vi går vidare till metoderna för detta gränssnitt.

Eftersom en Deque är en dubbeländad kö, vilket innebär att du kan arbeta med element både i början och slutet av kön, är dess metoder anpassade för denna egenskap.

Metoder

Några viktiga metoder i Deque-gränssnittet är:

  • addFirst(element): lägger till ett element i början av deque;
  • addLast(element): lägger till ett element i slutet av deque.

Det är tydligt att det i en deque finns metoder för att lägga till i början och slutet. Namnen på dessa metoder är självförklarande. Låt oss titta på dessa metoder i kod:

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

Som du kan se, efter att ha använt metoden addFirst(), lades elementet till i början av deque. Detta skiljer sig från metoden addLast().

Deque har också en vanlig metod add(), som fungerar på samma sätt som metoden addLast(). Därför är valet av metod helt upp till dig.

Borttagningsmetoder

Om det finns metoder för att lägga till element i början och slutet, bör det också finnas metoder för att ta bort från början och slutet av deque.

  • removeFirst(): tar bort och returnerar elementet från början av deque;
  • removeLast(): tar bort och returnerar elementet från slutet av deque.

Metoderna addFirst() och addLast() utför borttagning av element från början och slutet av deque.

Låt oss titta på ett exempel på användning i koden:

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

Som du kan se har vi tagit bort det första och sista elementet från deque, vilket lämnar endast det andra elementet kvar.

Det är enkelt och bekvämt, och metodnamnen talar för sig själva.

Åtkomstmetoder

Nästa steg är att gå vidare till metoder för åtkomst till element i en deque.

  • getFirst(): hämtar, men tar inte bort, elementet i början av deque;
  • getLast(): hämtar, men tar inte bort, elementet i slutet av deque.

Detta gör det möjligt att komma åt första och sista elementet i en dubbelriktad kö.

Nu ska vi titta på ett kodexempel:

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

Med hjälp av metoderna getFirst() och getLast() hämtades de första och sista elementen från deque-strukturen och tilldelades nyss skapade variabler.

I Deque-gränssnittet finns även metoderna peekFirst() och peekLast(), vilka hanterar problemet med att kasta ett undantag. Istället för att kasta ett undantag och stoppa programmet returnerar de null om kön är tom.

Låt oss titta på ett exempel:

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

Från detta exempel blev det tydligt att det är mycket bättre att använda metoderna peekFirst() och peekLast() istället för getFirst() och getLast(), eftersom de inte stoppar programmet vid ett fel.

Glöm dock inte bort NullPointerException! Detta undantag kan orsaka många problem i ditt program.

Det finns också motsvarande alternativa metoder för metoderna addFirst(), addLast(), removeFirst() och removeLast(). Vi kommer inte att uppehålla oss vid dem länge, eftersom du redan förstår hur dessa metoder fungerar, men här är listan:

Alternativa metoder

Metoder för att lägga till ett element i deque:

  • offerFirst(E e): lägger till ett element i början av deque, om möjligt, och returnerar true. Returnerar false om tillägg inte är möjligt;
  • offerLast(E e): lägger till ett element i slutet av deque, om möjligt, och returnerar true. Returnerar false om tillägg inte är möjligt;
  • push(E e): lägger till ett element i början av deque, liknande addFirst(). Observera att push() också är en stackmetod i klassen Deque.

Metoder för att ta bort ett element från deque:

  • pollFirst(): tar bort och returnerar det första elementet i deque. Returnerar null om deque är tom;
  • pollLast(): tar bort och returnerar det sista elementet i deque. Returnerar null om deque är tom;
  • pop(): tar bort och returnerar det första elementet i deque, liknande removeFirst().

Valet beror på programmets krav. Du kan alltid lösa allt med en vanlig array, men det skulle vara ganska utmanande och inte optimerat. Det är därför så många olika datastrukturer finns—för att göra det mer bekvämt att skriva olika program.

1. Vad står "Deque" för?

2. Vilket gränssnitt i Java representerar en Deque?

3. Vad är syftet med metoden addFirst() i en Deque?

4. Vilken metod används för att hämta, men inte ta bort, det sista elementet i en Deque?

question mark

Vad står "Deque" för?

Select the correct answer

question mark

Vilket gränssnitt i Java representerar en Deque?

Select the correct answer

question mark

Vad är syftet med metoden addFirst() i en Deque?

Select the correct answer

question mark

Vilken metod används för att hämta, men inte ta bort, det sista elementet i en Deque?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 2
some-alt