מצלמת Java – מצלמת רשימה ב-Java

כפי שאנו יודעים, Java מכילה ארבעה סמנים (cursors): Enumeration, Iterator, ListIterator, ו-Spliterator. דיברנו כבר על הסמנים Enumeration ו-Iterator בפוסט הקודם שלי. לפני שתמשיך לקרוא את פוסט זה, אני ממליץ לך לעבור על הפוסט הקודם שלי בקישור: Java Iterator. בפוסט הזה, אנו נדבר על הסמן השלישי של Java: ListIterator.

Java ListIterator

כמו Iterator, ListIterator הוא Iterator של Java, המשמש לעבור על איברים אחד-לפי-אחד מאובייקט ממומש List.

  • זה זמין מ-Java 1.2.
  • הוא מרחיב את ממשק Iterator.
  • הוא שימושי רק למחלקות שמממשות List.
  • בניגוד ל-Iterator, הוא תומך בכל ארבעת הפעולות: CRUD (יצירה, קריאה, עדכון ומחיקה).
  • בניגוד ל-Iterator, הוא תומך בשני כיוונים: קדימה ואחורה.
  • זהו Iterator דו-כיווני.
  • אין לו איבר נוכחי; מיקום הסמן שלו תמיד נמצא בין האיבר שיחזור בקריאה לפונקציה previous() והאיבר שיחזור בקריאה לפונקציה next().

הערה:- מהם פעולות CRUD ב-Collection API?

  • יצירה: הוספת איברים חדשים לאובייקט Collection.
  • קריאה: אחזור איברים מתוך אובייקט Collection.
  • עדכון: עדכון או הגדרת אלמנטים קיימים באובייקט Collection.
  • מחיקה: מסירת אלמנטים מאובייקט Collection.

תרשים של מחלקת ה-ListIterator ב-Java

ב-Java, ListIterator היא ממשק ב-Collection API. היא מרחיבה את ממשק ה-Iterator. כדי לתמוך בסיבוב ובכיוון לאחור ובפעולות CRUD, היא מכילה את השיטות הבאות. ניתן להשתמש באיטרטור זה עבור כל המחלקות בממשק List הממומשות כמו ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector, ועוד. נחקור את השיטות הללו בעומק עם כמה שיטות שימושיות בחלקים הבאים.

שיטות של מחלקת ה-ListIterator ב-Java

למחלקת ListIterator ב-Java יש את השיטות הבאות.

  • void add(E e): מכניס את האלמנט הספציפי לרשימה.
  • boolean hasNext(): מחזיר true אם לאיטרטור רשימה זה יש עוד אלמנטים בעת עבור על הרשימה בכיוון הקדמי.
  • boolean hasPrevious(): מחזיר true אם לאיטרטור רשימה זה יש עוד אלמנטים בעת עבור על הרשימה בכיוון האחורי.
  • E next(): Returns the next element in the list and advances the cursor position.
  • int nextIndex(): מחזיר את האינדקס של האיבר שיוחזר בקריאה לפונקציה next() הבאה.
  • E previous(): Returns the previous element in the list and moves the cursor position backwards.
  • int previousIndex(): מחזיר את האינדקס של האיבר שיוחזר בקריאה לפונקציה previous() הבאה.
  • void remove(): מסיר מהרשימה את האיבר האחרון שהוחזר על ידי next() או previous().
  • void set(E e): מחליף את האיבר האחרון שהוחזר על ידי next() או previous() עם האיבר הצויין.

נחקור את השיטות הללו בנפרד עם דוגמאות שימושיות בקטעים הבאים.

דוגמא בסיסית של ListIterator ב-Java

בקטע זה, נדבר על כמה מהשיטות של ListIterator עם דוגמאות. קודם כל, עלינו להבין איך לקבל את אובייקט ה-iterator הזה. איך לקבל ListIterator?

ListIterator<E> listIterator()

הפונקציה מחזירה iterator של רשימה על האיברים ברשימה. דוגמא:-

import java.util.*;

public class ListIteratorDemo 
{
  public static void main(String[] args) 
  {
	List();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
		
	// קבלת ListIterator
	ListIterator<String> namesIterator = names.listIterator();
	
	// עבר על האיברים
	while(namesIterator.hasNext()){
	   System.out.println(namesIterator.next());			
	}	

	// לולאת for משודרגת יוצרת Iterator פנימי כאן.
	for(String name: names){
	   System.out.println(name);			
	}	
  }
}

פלט:-

Rams
Posa
Chinni

דוגמא לאיטרציה דו-כיוונית עם ListIterator

בסעיף זה, נחקור איך פעולות ה-ListIterator פועלות כדי לבצע תרומת הכיוון והכיוון ההפוך.

import java.util.*;

public class BiDirectinalListIteratorDemo 
{
	public static void main(String[] args) 
	{
		List();
		names.add("Rams");
		names.add("Posa");
		names.add("Chinni");
		
		// קבלת ListIterator
		ListIterator<String> listIterator = names.listIterator();
		
		// ניווט בין האיברים
		System.out.println("Forward Direction Iteration:");
		while(listIterator.hasNext()){
			System.out.println(listIterator.next());			
		}	
		
		// ניווט בין האיברים, the iterator is at the end at this point
		System.out.println("Backward Direction Iteration:");
		while(listIterator.hasPrevious()){
			System.out.println(listIterator.previous());			
		}
	}
}

פלט:-

Forward Direction Iteration:
Rams
Posa
Chinni
Backward Direction Iteration:
Chinni
Posa
Rams

סוגי איטרטורים ב-Java

כפי שאנו יודעים, ב-Java יש ארבעה סוגי סמנים: Enumeration, Iterator, ListIterator ו-Spliterator. אנו יכולים לסווג אותם לשני סוגים עיקריים כפי שמוצג למטה:

  • איטרטורים חד-כיווניים
    אלו הם סמנים שתומכים רק בתרומות בכיוון הקדימה. לדוגמה, Enumeration, Iterator וכו '. הם איטרטורים חד-כיווניים.- איטרטורים דו-כיווניים
    אלו הם סמנים שתומכים בשני הכיוונים – הקדמה ואחורה. לדוגמה, ListIterator הוא איטרטור דו-כיווני.

איך עובד ListIterator של Java פנימית?

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

  • שיטות האיטרציה בכיוון קדימה
    אנו צריכים להשתמש בשיטות הבאות כדי לתמוך באיטרציה בכיוון קדימה:
  1. hasNext())
  2. next()
  3. nextIndex()
  • שיטות האיטרציה בכיוון אחורה
    אנו צריכים להשתמש בשיטות הבאות כדי לתמוך באיטרציה בכיוון אחורה:
  1. hasPrevious()
  2. previous()
  3. previousIndex()

בפוסט הקודם שלי, דיברנו כבר על איך מעבד עובד פנימית בכיוון קדימה בקטע "כיצד עובד Iterator ב-Java פנימית?" אם אתם רוצים לעבור על הפוסט הקודם שלי, נא ללחוץ כאן: Java Iterator. בקטע זה, נדון באיך ListIterator פועל בכיוון אחורה. נקח את אובייקט ה-LinkedList הבא כדי להבין את הפונקציונליות הזו.

List<String> names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");

כעת ניצור אובייקט ListIterator ב-LinkedList כפי שמוצג למטה:

ListIterator<String> namesIterator = names.listLterator();

נניח ש-"namesIterator" ListIterator נראה כמו שמוצג למטה: בזמן זה, הקורסור של ListIterator מצביע לפני האיבר הראשון ברשימה. כעת נריץ את קטע הקוד הבא בלולאת while.

namesIterator.hasNext();
namesIterator.next();

כאשר אנו מריצים את קטע הקוד לעיל בלולאת while, הקורסור של ListIterator מצביע לאיבר האחרון ב-LinkedList. אז אנו יכולים להריץ את קטע הקוד הבא כדי להתחיל לעבור מהסוף להתחלה.

namesIterator.hasPrevious();
namesIterator.previous();

כאשר אנו מפעילים את קטע הקוד לעיל, העכבר של ListIterator מצביע על האלמנט "אחרון אך אחד" ברשימה כפי שמוצג בתרשים לעיל. עשויים לבצע תהליך זה על מנת להגיע את עכבר ה-ListIterator לאלמנט הראשון של ה-LinkedList. לאחר שקריאה של האלמנט הראשון, אם נריץ את קטע הקוד למטה, הוא יחזיר ערך "שקר".

namesIterator.hasPrevious();

מכיוון שעכבר ה-ListIterator מצביע לפני האלמנט הראשון של ה-LinkedList, אזי השיטה hasPrevious() תחזיר ערך שקר. לאחר צפייה בכל התרשימים אלו, אנו יכולים לומר כי ListIterator ב-Java תומך בשני כיוונים לאיטרציה כפי שמוצג בתרשימים למטה. לכן הוא נקרא גם עכבר דו-כיווני. עכבר כיוון קדימה של ListIterator עכבר כיוון אחורה של ListIterator

יתרונות של ListIterator

שונים מ-Iterator, ל-ListIterator יש את היתרונות הבאים:

  • כמו Iterator, הוא תומך בפעולות קריאה ומחיקה.
  • הוא גם תומך בפעולות יצירה ועדכון.
  • אנסול: הכוונה היא, הוא תומך בפעולות CRUD: יצירה, קריאה, עדכון ומחיקה.
  • הוא תומך בשני הכיוונים – קדימה ואחורה. כלומר, זהו סוג של קורסור ג'אווה דו-כיווני.
  • שמות השיטות הם פשוטים וקלים לשימוש.

הגבלות של ListIterator

בהשוואה ל-Iterator, ב- Java, ListIterator יש המון יתרונות. אך יש לו עדיין כמה הגבלות.

  • זהו מימוש רק של Iterator ברשימות.
  • להבחנה מ-Iterator, אין יישום לכל ה-API של קולקציה.
  • אין זה קורסור ג'אווה אוניברסלי.
  • בהשוואה ל-Spliterator, אין לו תמיכה בפריטה פרללית של אלמנטים.
  • בהשוואה ל-Spliterator, אין לו יעילות טובה יותר לנסיעה על נתונים בהיקף גדול.

דמיונים בין Iterator ו-ListIterator

במקטע זה, נדבר על הדמיונים בין שני קורסורים ב-Java: Iterator ו-ListIterator.

  • שנייהם הוצגו ב-Java 1.2.
  • שניים אלו הם Iterator שמשתמשים לנסיעה על אלמנטים באוסף או ברשימה.
  • שניהם תומכים בפעולות קריאה ומחיקה.
  • שניהם תומכים באיטרציה בכיוון הקדמי.
  • שניהם אינם ממשקים מורשים.

ההבדלים בין Iterator ו־ListIterator

במקטע זה, נדון בהבדלים בין שני האיטרטורים של ג'אווה: Iterator ו־ListIterator.

Iterator ListIterator
Introduced in Java 1.2. Introduced in Java 1.2.
It is an Iterator for whole Collection API. It is an Iterator for only List implemented classes.
It is an Universal Iterator. It is NOT an Universal Iterator.
It supports only Forward Direction Iteration. It supports both Forward and Backward Direction iterations.
It’s a Uni-Directional Iterator. It’s a Bi-Directional Iterator.
It supports only READ and DELETE operations. It supports all CRUD operations.
We can get Iterator by using iterator() method. We can ListIterator object using listIterator() method.

זהו כל הדיון על ListIterator בג'אווה. אני מקווה שתיאוריות ודוגמאות אלו על ListIterator בג'אווה יעזרו לך להתחיל בתכנות עם ListIterator. מקור: מסמך API של ListIterator

Source:
https://www.digitalocean.com/community/tutorials/java-listiterator