Kratki vodič za Java stog

1. Pregled

U ovom brzom članku predstavit ćemo java.util.Stack predavanja i počnite gledati kako to možemo iskoristiti.

Stog je generička struktura podataka koja predstavlja LIFO (zadnji ulaz, prvi izlaz) zbirka objekata koja omogućuje guranje / iskakanje elemenata u stalnom vremenu.

Za nove implementacije, trebali bismo preferirati a Deque sučelje i njegove implementacije. Deque definira cjelovitiji i dosljedniji skup LIFO operacija. Međutim, možda ćemo još uvijek morati riješiti problem Stog klase, posebno u naslijeđenom kodu, je li važno da ga bolje poznajete.

2. Stvorite stog

Počnimo sa stvaranjem prazne instance Stog, korištenjem zadanog konstruktora bez argumenata:

@Test public void whenStackIsCreated_thenItHasSizeZero () {Stack intStack = novi stog (); assertEquals (0, intStack.size ()); }

Ovo će stvoriti Stog sa zadanim kapacitetom od 10. Ako broj dodanih elemenata premašuje ukupan broj Stog veličina, automatski će se udvostručiti. Međutim, njegova se veličina nikada neće smanjiti nakon uklanjanja elemenata.

3. Sinkronizacija za Stack

Stog je izravan podrazred od Vektor; ovo znači to slično svojoj superklasi, to je sinkronizirano provedba.

Međutim, sinkronizacija nije uvijek potrebna, u takvim se slučajevima preporučuje korištenje ArrayDeque.

4. Dodajte u stog

Počnimo s dodavanjem elementa na vrh Stog, s gurnuti() metoda - koja također vraća dodani element:

@Test public void whenElementIsPushed_thenStackSizeIsIncreased () {Stack intStack = new Stack (); intStack.push (1); assertEquals (1, intStack.size ()); }

Koristeći gurnuti() metoda ima isti učinak kao i upotreba addElement (). Ton je jedina razlika u tome addElement () vraća rezultat operacije, umjesto elementa koji je dodan.

Također možemo dodati više elemenata odjednom:

@Test public void whenMultipleElementsArePushed_thenStackSizeIsIncreased () {Stack intStack = new Stack (); Popis intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); logički rezultat = intStack.addAll (intList); assertTrue (rezultat); assertEquals (7, intList.size ()); }

5. Dohvat iz snopa

Dalje, pogledajmo kako doći i ukloniti posljednji element u a Stog:

@Test public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges () {Stack intStack = new Stack (); intStack.push (5); Cjeloviti element = intStack.pop (); assertEquals (Integer.valueOf (5), element); assertTrue (intStack.isEmpty ()); }

Možemo dobiti i zadnji element Sljepljivost bez uklanjanja:

@Test public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange () {Stack intStack = new Stack (); intStack.push (5); Cjeloviti element = intStack.peek (); assertEquals (Integer.valueOf (5), element); assertEquals (1, intStack.search (5)); assertEquals (1, intStack.size ()); }

6. Potražite element u stogu

6.1. traži

Stog omogućuje nam traženje elementai dobiti njegovu udaljenost od vrha:

@Test public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop () {Stack intStack = new Stack (); intStack.push (5); intStack.push (8); assertEquals (2, intStack.search (5)); }

Rezultat je indeks datog objekta. Ako je prisutno više elemenata, indeks onogvraćen je najbliži vrhu. Predmet koji se nalazi na vrhu stoga smatra se položajem 1.

Ako objekt nije pronađen, traži() vratit će -1.

6.2. Dobivanje indeksa elementa

Da biste dobili indeks elementa na Slijepljenje, možemo koristiti i indexOf () i lastIndexOf () metode:

@Test public void whenElementIsOnStack_thenIndexOfReturnsItsIndex () {Stack intStack = new Stack (); intStack.push (5); int indexOf = intStack.indexOf (5); assertEquals (0, indexOf); }

ThelastIndexOf () uvijek će pronaći indeks elementa koji je najbliži vrhu stoga. Ovo djeluje vrlo slično kao traži() - s važnom razlikom da vraća indeks, umjesto udaljenosti od vrha:

@Test public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex () {Stack intStack = new Stack (); intStack.push (5); intStack.push (5); intStack.push (5); int lastIndexOf = intStack.lastIndexOf (5); assertEquals (2, lastIndexOf); }

7. Uklonite elemente iz hrpe

Osim pop () operacija, koja se koristi i za uklanjanje i za dohvaćanje elemenata, također možemo koristiti više operacija naslijeđenih iz Vektor klasa za uklanjanje elemenata.

7.1. Uklanjanje navedenih elemenata

Možemo koristiti removeElement () metoda za uklanjanje prvog pojavljivanja datog elementa:

@Test public void whenRemoveElementIsInvoked_thenElementIsRemoved () {Stack intStack = new Stack (); intStack.push (5); intStack.push (5); intStack.removeElement (5); assertEquals (1, intStack.size ()); }

Također možemo koristiti removeElementAt () za brisanje elemenata pod navedenim indeksom u Stog:

 @Test public void whenRemoveElementAtIsInvoked_thenElementIsRemoved () {Stack intStack = new Stack (); intStack.push (5); intStack.push (7); intStack.removeElementAt (1); assertEquals (-1, intStack.search (7)); }

7.2. Uklanjanje više elemenata

Kratko ćemo pogledati kako ukloniti više elemenata iz a Stog koristiti ukloniti sve() API - koji će potrajati Kolekcija kao argument i uklonite sve odgovarajuće elemente iz Stog:

@Test javna praznina givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved () {Stack intStack = novi stog (); Popis intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); intStack.add (500); intStack.removeAll (intList); assertEquals (1, intStack.size ()); assertEquals (1, intStack.search (500)); }

Također je moguće ukloni sve elemente iz Stog koristiti čisto() ili removeAllElements () metode; obje te metode rade isto:

@Test public void whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved () {Stack intStack = new Stack (); intStack.push (5); intStack.push (7); intStack.removeAllElements (); assertTrue (intStack.isEmpty ()); }

7.3. Uklanjanje elemenata pomoću filtra

Također možemo koristiti uvjet za uklanjanje elemenata iz Stog. Pogledajmo kako to učiniti pomoću ukloniAko(), s izrazom filtra kao argumentom:

@Test public void whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved () {Stack intStack = novi stog (); Popis intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); intStack.removeIf (element -> element <6); assertEquals (2, intStack.size ()); }

8. Iteracija nad hrpom

Stog omogućuje nam upotrebu oba Iterator i a ListIterator. Glavna razlika je u tome što nam prva omogućuje kretanje Stog u jednom smjeru, a drugi nam omogućuje da to učinimo u oba smjera:

@Test public void whenA AnotherStackCreatedWhileTraversingStack_thenStacksAreEqual () {Stack intStack = new Stack (); Popis intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); ListIterator it = intStack.listIterator (); Rezultat stoga = novi stog (); while (it.hasNext ()) {result.push (it.next ()); } assertThat (rezultat, jednakTo (intStack)); }

svi Iteratore vratio do Stog su neuspješni.

9. Stream API za Java stog

Stog je zbirka, što znači da je možemo koristiti s Javom 8 Potoci API. Koristeći Stream s Stog je slična upotrebi s bilo kojim drugim Kolekcija:

@Test public void whenStackIsFiltered_allElementsNotSatisfyingFilterConditionAreDiscarded () {Stack intStack = new Stack (); Popis inputIntList = Arrays.asList (1, 2, 3, 4, 5, 6, 7, 9, 10); intStack.addAll (inputIntList); Popis filtriran = intStack .stream () .filter (element -> element <= 3) .collect (Collectors.toList ()); assertEquals (3, filtered.size ()); }

10. Sažetak

Ovaj je vodič kratki i praktični vodič za razumijevanje ove osnovne klase u Javi - Stog.

Naravno, u Javadocu možete istražiti puni API.

Kao i uvijek, svi uzorci koda mogu se naći na GitHubu.