Stručný sprievodca súborom Java Stack

1. Prehľad

V tomto rýchlom článku si predstavíme java.util.Stack triedy a začať sa zaoberať tým, ako to môžeme využiť.

Stoh je všeobecná dátová štruktúra, ktorá predstavuje kolekciu objektov LIFO (last in, first out) umožňujúcu tlačenie / vyskakovanie prvkov v konštantnom čase.

Pre nové implementácie mali by sme uprednostniť a Deque rozhranie a jeho implementácie. Deque definuje úplnejší a konzistentnejší súbor operácií LIFO. Možno však budeme musieť vyriešiť problém s Stoh triedy, hlavne v starom kóde, je dôležité vedieť ho lepšie.

2. Vytvorte stoh

Začnime vytvorením prázdnej inštancie Stohpomocou predvoleného konštruktora bez argumentov:

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

Toto bude Vytvor Stoh s predvolenou kapacitou 10. Ak počet pridaných prvkov presahuje celkový počet Stoh veľkosť sa automaticky zdvojnásobí. Jeho veľkosť sa však po odstránení prvkov nikdy nezmenší.

3. Synchronizácia pre zásobník

Stoh je priama podtrieda Vektor; to znamená, že podobne ako jeho nadtrieda je to a synchronizované implementácia.

Synchronizácia však nie je vždy potrebná, v takýchto prípadoch sa odporúča použiť ArrayDeque.

4. Pridajte do stohu

Začnime pridaním prvku do hornej časti Stoh, s tam() metóda - ktorá tiež vráti prvok, ktorý bol pridaný:

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

Použitím tam() metóda má rovnaký efekt ako použitie addElement (). Trozdiel je iba v tom addElement () vráti výsledok operácie namiesto prvku, ktorý bol pridaný.

Môžeme tiež pridať viac prvkov naraz:

@Test public void whenMultipleElementsArePushed_thenStackSizeIsIncreased () {Stack intStack = new Stack (); List intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); boolovský výsledok = intStack.addAll (intList); assertTrue (výsledok); assertEquals (7, intList.size ()); }

5. Vyzdvihnutie zo stohu

Ďalej sa pozrime, ako získať a odstrániť posledný prvok v a Stoh:

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

Môžeme tiež získať posledný prvok Spripináčik bez odstránenia:

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

6. Vyhľadajte prvok v zásobníku

6.1. Vyhľadávanie

Stoh umožňuje nám vyhľadať prvoka získajte jeho vzdialenosť zhora:

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

Výsledkom je index daného objektu. Ak je prítomných viac ako jeden prvok, index jednéhovráti sa najbližšie k vrcholu. Položka, ktorá je v hornej časti stohu, sa považuje za položku na pozícii 1.

Ak objekt nenájdete, Vyhľadávanie() vráti -1.

6.2. Získanie indexu prvku

Ak chcete získať index prvku na Spripináčik, môžeme tiež použiť indexOf () a lastIndexOf () metódy:

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

ThelastIndexOf () vždy nájde index prvku, ktorý je najbližšie k hornej časti zásobníka. Funguje to veľmi podobne ako v prípade Vyhľadávanie() - s dôležitým rozdielom, že vráti index namiesto vzdialenosti od vrchu:

@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. Odstráňte prvky zo stohu

Okrem pop () operácie, ktorá sa používa na odstraňovanie aj načítanie prvkov, môžeme tiež použiť viac operácií zdedených z Vektor triedy na odstránenie prvkov.

7.1. Odstránenie určených prvkov

Môžeme použiť removeElement () metóda na odstránenie prvého výskytu daného prvku:

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

Môžeme tiež použiť removeElementAt () sk Odstrániť prvky pod určeným indexom v priečinku Stoh:

 @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. Odstránenie viacerých prvkov

Poďme sa rýchlo pozrieť na to, ako odstrániť viac prvkov z a Stoh pomocou odobrať všetky() API - ktoré bude trvať a Zbierka ako argument a odstráňte všetky zodpovedajúce prvky z priečinka Stoh:

@Test public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved () {Stack intStack = new Stack (); List 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)); }

Je to tiež možné odstrániť všetky prvky z Stoh pomocou jasný() alebo removeAllElements () metódy; obe tieto metódy fungujú rovnako:

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

7.3. Odstránenie prvkov pomocou filtra

Môžeme tiež použiť podmienku na odstránenie prvkov z Stoh. Pozrime sa, ako to urobiť pomocou removeIf(), s výrazom filtra ako argumentom:

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

8. Iterujte cez hromadu

Stoh nám umožňuje používať oboje Iterátor a a ListIterator. Hlavný rozdiel je v tom, že prvý nám umožňuje traverz Stoh v jednom smere a druhom nám to umožňuje v oboch smeroch:

@Test public void whenAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual () {Stack intStack = new Stack (); List intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); ListIterator it = intStack.listIterator (); Výsledok zásobníka = nový zásobník (); while (it.hasNext ()) {result.push (it.next ()); } assertThat (result, equalTo (intStack)); }

Všetky Iterátory vrátil sa Stoh sú rýchle.

9. Stream API pre Java Stack

Stoh je kolekcia, čo znamená, že ju môžeme používať s Java 8 Prúdy API. Použitím Prúd s Stoh je podobné ako pri použití s ​​akýmkoľvek iným Zbierka:

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

10. Zhrnutie

Tento výukový program je rýchlym a praktickým sprievodcom po porozumení tejto základnej triedy v prostredí Java - Stoh.

Celé API môžete samozrejme preskúmať v Javadocu.

A ako vždy, všetky vzorky kódu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found