Deque-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
1Deque<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
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); } }
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
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); } }
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
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); } }
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
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); } }
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 returnerartrue. Returnerarfalseom tillägg inte är möjligt;offerLast(E e): lägger till ett element i slutet av deque, om möjligt, och returnerartrue. Returnerarfalseom tillägg inte är möjligt;push(E e): lägger till ett element i början av deque, liknandeaddFirst(). Observera attpush()också är en stackmetod i klassenDeque.
Metoder för att ta bort ett element från deque:
pollFirst(): tar bort och returnerar det första elementet i deque. Returnerarnullom deque är tom;pollLast(): tar bort och returnerar det sista elementet i deque. Returnerarnullom deque är tom;pop(): tar bort och returnerar det första elementet i deque, liknanderemoveFirst().
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?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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?
Fantastiskt!
Completion betyg förbättrat till 4
Deque-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
1Deque<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
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); } }
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
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); } }
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
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); } }
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
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); } }
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 returnerartrue. Returnerarfalseom tillägg inte är möjligt;offerLast(E e): lägger till ett element i slutet av deque, om möjligt, och returnerartrue. Returnerarfalseom tillägg inte är möjligt;push(E e): lägger till ett element i början av deque, liknandeaddFirst(). Observera attpush()också är en stackmetod i klassenDeque.
Metoder för att ta bort ett element från deque:
pollFirst(): tar bort och returnerar det första elementet i deque. Returnerarnullom deque är tom;pollLast(): tar bort och returnerar det sista elementet i deque. Returnerarnullom deque är tom;pop(): tar bort och returnerar det första elementet i deque, liknanderemoveFirst().
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?
Tack för dina kommentarer!