מדריך מהיר לערמת ג'אווה

1. סקירה כללית

במאמר מהיר זה נציג את ערימה בכיתה והתחל לבדוק כיצד אנו יכולים להשתמש בה.

לַעֲרוֹם הוא מבנה נתונים גנרי המייצג אוסף LIFO (אחרון בכניסה ראשונה) של אובייקטים המאפשר לדחוף / להקפיץ אלמנטים בזמן קבוע.

ליישומים החדשים, עלינו להעדיף א דק ממשק ויישומיו. דק מגדיר מערך שלם ועקבי יותר של פעולות LIFO. עם זאת, ייתכן שנצטרך עדיין להתמודד עם ה- לַעֲרוֹם בכיתה, במיוחד בקוד מדור קודם, חשוב לדעת זאת טוב יותר.

2. צור ערימה

נתחיל ביצירת מופע ריק של לַעֲרוֹם, באמצעות בונה ברירת המחדל ללא ארגומנטים:

@Test הציבור בטל כאשרStackIsCreated_thenItHasSizeZero () {Stack intStack = Stack חדש (); assertEquals (0, intStack.size ()); }

זה יהיה ליצור לַעֲרוֹם עם קיבולת ברירת המחדל של 10. אם מספר האלמנטים שנוספו עולה על הסכום הכולל לַעֲרוֹם גודל, הוא יוכפל אוטומטית. עם זאת, גודלו לעולם לא יצטמצם לאחר הסרת אלמנטים.

3. סנכרון עבור Stack

לַעֲרוֹם הוא תת-מחלקה ישירה של וֶקטוֹר; זה אומר ש בדומה למעמד העל שלו, זה א מסונכרן יישום.

עם זאת, לא תמיד יש צורך בסנכרון, במקרים כאלה מומלץ להשתמש ArrayDeque.

4. הוסף לערימה

נתחיל בהוספת אלמנט לראש ה לַעֲרוֹם, עם ה לִדחוֹף() שיטה - המחזירה גם את האלמנט שנוסף:

@Test הציבור בטל כאשרElementIsPushed_thenStackSizeIsIncreased () {Stack intStack = מחסנית חדשה (); intStack.push (1); assertEquals (1, intStack.size ()); }

באמצעות לִדחוֹף() לשיטה אותה השפעה כמו השימוש addElement (). טההבדל היחיד הוא זה addElement () מחזיר את תוצאת הפעולה, במקום האלמנט שנוסף.

אנו יכולים גם להוסיף מספר אלמנטים בבת אחת:

@ מבחן ציבורי בטל כאשר MultipleElementsArePushed_thenStackSizeIsIncreased () {Stack intStack = מחסנית חדשה (); רשימת intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); תוצאה בוליאנית = intStack.addAll (intList); assertTrue (תוצאה); assertEquals (7, intList.size ()); }

5. אחזר מערימה

לאחר מכן, בואו נסתכל כיצד להשיג ולהסיר את האלמנט האחרון ב- לַעֲרוֹם:

@Test הציבור בטל כאשרElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges () {Stack intStack = מחסנית חדשה (); intStack.push (5); אלמנט שלם = intStack.pop (); assertEquals (Integer.valueOf (5), אלמנט); assertTrue (intStack.isEmpty ()); }

אנחנו יכולים גם להשיג את האלמנט האחרון של ה- Sנַעַץ מבלי להסיר אותו:

@Test הציבור בטל כאשרElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange () {Stack intStack = מחסנית חדשה (); intStack.push (5); אלמנט שלם = intStack.peek (); assertEquals (Integer.valueOf (5), אלמנט); assertEquals (1, intStack.search (5)); assertEquals (1, intStack.size ()); }

6. חפש אלמנט בערימה

6.1. לחפש

לַעֲרוֹם מאפשר לנו לחפש אלמנטוקבל את המרחק מלמעלה:

@Test הציבור בטל כאשרElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop () {Stack intStack = מחסנית חדשה (); intStack.push (5); intStack.push (8); assertEquals (2, intStack.search (5)); }

התוצאה היא אינדקס של אובייקט נתון. אם קיים יותר מאלמנט אחד, המדד של האחדהכי קרוב לראש מוחזר. הפריט שנמצא בראש הערימה נחשב למצב 1.

אם האובייקט לא נמצא, לחפש() יחזור -1.

6.2. קבלת אינדקס של אלמנט

כדי לקבל אינדקס של אלמנט ב- Sנַעַץ, אנחנו יכולים גם להשתמש ב- אינדקס של() ו lastIndexOf () שיטות:

@ מבחן ציבורי בטל כאשר ElementIsOnStack_thenIndexOfReturnsItsIndex () {Stack intStack = stack חדש (); intStack.push (5); int indexOf = intStack.indexOf (5); assertEquals (0, indexOf); }

הlastIndexOf () תמיד ימצא את אינדקס האלמנט הקרוב ביותר לראש הערימה. זה עובד מאוד דומה ל- לחפש() - עם ההבדל החשוב שהוא מחזיר את האינדקס, במקום המרחק מלמעלה:

@Test הציבור בטל כאשרMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex () {Stack intStack = מחסנית חדשה (); intStack.push (5); intStack.push (5); intStack.push (5); int lastIndexOf = intStack.lastIndexOf (5); assertEquals (2, lastIndexOf); }

7. הסר אלמנטים מערימה

חוץ מ פּוֹפּ() הפעולה, המשמשת הן להסרת ושליפת אלמנטים, אנו יכולים גם להשתמש בפעולות מרובות שעוברות בירושה מה- וֶקטוֹר מחלקה להסרת אלמנטים.

7.1. הסרת אלמנטים מוגדרים

אנחנו יכולים להשתמש ב- removeElement () שיטה להסרת המופע הראשון של האלמנט הנתון:

@ מבחן ציבורי בטל כאשר RemoveElementIsInvoked_thenElementIsRemoved () {Stack intStack = stack חדש (); intStack.push (5); intStack.push (5); intStack.removeElement (5); assertEquals (1, intStack.size ()); }

אנחנו יכולים גם להשתמש ב- removeElementAt () למחיקת אלמנטים תחת אינדקס שצוין ב- לַעֲרוֹם:

 @Test ציבורי בטל whenRemoveElementAtIsInvoked_thenElementIsRemoved () {Stack intStack = מחסנית חדשה (); intStack.push (5); intStack.push (7); intStack.removeElementAt (1); assertEquals (-1, intStack.search (7)); }

7.2. הסרת אלמנטים מרובים

בואו נסתכל במהירות כיצד להסיר מספר אלמנטים מ- a לַעֲרוֹם משתמש ב להסיר את כל() API - שייקח אוסף כוויכוח והסר את כל האלמנטים התואמים מה- לַעֲרוֹם:

@Test הציבור בטל givenElementsOnStack_whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved () {Stack intStack = מחסנית חדשה (); רשימת 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)); }

אפשר גם הסר את כל האלמנטים מה- לַעֲרוֹם משתמש ב ברור() אוֹ removeAllElements () שיטות; שתי השיטות הללו פועלות זהה:

@Test ציבורי בטל כאשר RemovAllElementsIsInvoked_thenAllElementsAreRemoved () {Stack intStack = מחסנית חדשה (); intStack.push (5); intStack.push (7); intStack.removeAllElements (); assertTrue (intStack.isEmpty ()); }

7.3. הסרת אלמנטים באמצעות פילטר

אנו יכולים גם להשתמש בתנאי להסרת אלמנטים מה- לַעֲרוֹם. בואו נראה איך לעשות זאת באמצעות ה- להסיר אם(), עם ביטוי מסנן כטיעון:

@ מבחן ציבורי בטל כאשר RemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved () {Stack intStack = מחסנית חדשה (); רשימת intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); intStack.removeIf (אלמנט -> אלמנט <6); assertEquals (2, intStack.size ()); }

8. התאטרף מעל ערימה

לַעֲרוֹם מאפשר לנו להשתמש בשתי an איטרטור ו ListIterator. ההבדל העיקרי הוא שהראשון מאפשר לנו לעבור לַעֲרוֹם בכיוון אחד ושני מאפשר לנו לעשות זאת בשני הכיוונים:

@Test הציבור בטל כאשרAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual () {Stack intStack = מחסנית חדשה (); רשימת intList = Arrays.asList (1, 2, 3, 4, 5, 6, 7); intStack.addAll (intList); ListIterator it = intStack.listIterator (); תוצאת מחסנית = מחסנית חדשה (); בעוד (it.hasNext ()) {result.push (it.next ()); } assertThat (תוצאה, equalTo (intStack)); }

את כל מחטבים הוחזר על ידי לַעֲרוֹם הם מהירים.

9. זרם API עבור ערימת Java

לַעֲרוֹם הוא אוסף, כלומר אנו יכולים להשתמש בו עם Java 8 זרמים ממשק API. באמצעות זרם עם ה לַעֲרוֹם דומה לשימוש בו עם כל אחר אוסף:

@Test הציבור בטל כאשרStackIsFiltered_allElementsNotSatisfyingFilterConditionAreDiscarded () {Stack intStack = מחסנית חדשה (); רשימת inputIntList = Arrays.asList (1, 2, 3, 4, 5, 6, 7, 9, 10); intStack.addAll (inputIntList); רשימה מסוננת = intStack .stream () .filter (element -> element <= 3) .collect (Collectors.toList ()); assertEquals (3, filtered.size ()); }

10. סיכום

מדריך זה הוא מדריך מהיר ופרקטי להבנת מחלקת הליבה הזו בג'אווה - לַעֲרוֹם.

כמובן, תוכלו לחקור את ה- API המלא ב- Javadoc.

וכמו תמיד, ניתן למצוא את כל דגימות הקוד ב- GitHub.


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