Gyors útmutató a Java veremhez

1. Áttekintés

Ebben a rövid cikkben bemutatjuk a java.util.Stack osztályban, és kezdje el vizsgálni, hogyan használhatjuk ki.

Kazal egy általános adatstruktúra, amely az objektumok LIFO (utoljára be, először ki) gyűjteményét reprezentálja, amely lehetővé teszi az elemek állandó időben történő tolását / felbukkanását.

Az új megvalósításokhoz inkább a Deque interfész és megvalósításai. Deque teljesebb és következetesebb LIFO-műveleteket határoz meg. Előfordulhat azonban, hogy még mindig foglalkoznunk kell a Kazal osztály, különös tekintettel a régi kódra, fontos-e jobban ismerni.

2. Hozzon létre egy verem

Kezdjük egy üres példány létrehozásával Kazal, az alapértelmezett, argumentum nélküli konstruktor használatával:

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

Ez lesz hozzon létre egy Kazal alapértelmezett kapacitása 10. Ha a hozzáadott elemek száma meghaladja az összeget Kazal méret, automatikusan megduplázódik. Mérete azonban soha nem fog csökkenni az elemek eltávolítása után.

3. Szinkronizálás a veremhez

Kazal közvetlen alosztálya Vektor; ez azt jelenti szuperosztályához hasonlóan a szinkronizált végrehajtás.

A szinkronizálásra azonban nem mindig van szükség, ilyen esetekben ajánlott használni ArrayDeque.

4. Tegye egy verembe

Kezdjük azzal, hogy hozzáadunk egy elemet a Kazal, a ... val nyom() metódus - amely a hozzáadott elemet is visszatér:

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

Használata nyom() módszer ugyanaz, mint a addElement (). Tcsak annyi a különbség addElement () a művelet eredményét adja vissza a hozzáadott elem helyett.

Több elemet is hozzáadhatunk egyszerre:

@Test public void whenMultipleElementsArePushed_thenStackSizeIsIncreased () {Stack intStack = new Stack (); Lista intList = Tömbök.asList (1, 2, 3, 4, 5, 6, 7); logikai eredmény = intStack.addAll (intList); assertTrue (eredmény); assertEquals (7, intList.size ()); }

5. Letöltés egy veremből

Ezután vessünk egy pillantást arra, hogy hogyan lehet eltávolítani és eltávolítani az a Kazal:

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

Megkaphatjuk az S utolsó elemét istapadás eltávolítása nélkül:

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

6. Keressen egy elemet egy veremben

6.1. Keresés

Kazal lehetővé teszi számunkra, hogy elemet keressünkés megkapja a távolságot a tetejétől:

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

Az eredmény egy adott objektum indexe. Ha egynél több elem van jelen, az egy indexea legközelebb a tetejéhez kerül vissza. A verem tetején lévő elem az 1. pozícióban van.

Ha az objektum nem található, keresés() -1-et ad vissza.

6.2. Elemindex beolvasása

Egy elem indexének megszerzése az S-ntapadás, használhatjuk a indexe() és lastIndexOf () mód:

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

AlastIndexOf () mindig megtalálja a verem tetejéhez legközelebb eső elem indexét. Ez nagyon hasonlóan működik keresés() - azzal a fontos különbséggel, hogy az indexet adja vissza, a tetejétől való távolság helyett:

@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. Távolítsa el az elemeket a veremből

Eltekintve a pop() művelet, az elemek eltávolítására és visszakeresésére egyaránt használható, a Vektor osztály az elemek eltávolításához.

7.1. Meghatározott elemek eltávolítása

Használhatjuk a removeElement () módszer az adott elem első előfordulásának eltávolítására:

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

Használhatjuk a removeElementAt () elem törlése egy megadott index alatt a Kazal:

 @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. Több elem eltávolítása

Nézzük meg gyorsan, hogyan távolíthatunk el több elemet a-ból Kazal használni a összes eltávolítása() API - amihez a Gyűjtemény érvként, és távolítsa el az összes megfelelő elemet a Kazal:

@Test public void givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved () {Stack intStack = new Stack (); Lista intList = Tömbök.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)); }

Az is lehetséges távolítson el minden elemet a Kazal használni a egyértelmű() vagy removeAllElements () mód; mindkét módszer ugyanúgy működik:

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

7.3. Elemek eltávolítása szűrővel

Feltételt is használhatunk az elemek eltávolításához a Kazal. Nézzük meg, hogyan lehet ezt megtenni a removeIf(), szűrőkifejezéssel argumentumként:

@Test public void whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved () {Stack intStack = new Stack (); Lista intList = Tömbök.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); intStack.removeIf (elem -> elem <6); assertEquals (2, intStack.size ()); }

8. Iterál egy halom felett

Kazal lehetővé teszi számunkra, hogy mind az an Iterátor és a ListIterator. A fő különbség az, hogy az első lehetővé teszi számunkra a bejárást Kazal az egyik és a második irányban lehetővé teszi számunkra, hogy ezt mindkét irányban elvégezzük:

@Test public void whenAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual () {Stack intStack = new Stack (); Lista intList = Tömbök.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); ListIterator it = intStack.listIterator (); Verem eredménye = új Verem (); while (it.hasNext ()) {result.push (it.next ()); } assertThat (eredmény, egyenlőTo (intStack)); }

Minden Iterátorok által visszatért Kazal kudarcot vallanak.

9. Stream API a Java veremhez

Kazal egy gyűjtemény, ami azt jelenti, hogy használhatjuk a Java 8-tal Patakok API. Használata Folyam a ... val Kazal hasonló ahhoz, mint bármely mással Gyűjtemény:

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

10. Összegzés

Ez a bemutató gyors és praktikus útmutató a Java ezen alaposztályának - a Kazal.

Természetesen felfedezheti a teljes API-t a Javadoc-ban.

És mint mindig, minden kódminta megtalálható a GitHubon.