ليست إيتيراتور في جافا – ListIterator في جافا

كما نعلم، يحتوي جافا على أربع مؤشرات: التعداد، المتكرر، المحدد_للقائمة، ومجزئ. لقد ناقشنا بالفعل مؤشرات التعداد والمتكرر في مشاركتي السابقة. قبل الاطلاع على هذه المشاركة، يرجى الانتقال إلى مشاركتي السابقة في: جافا المتكرر. في هذه المشاركة، سنناقش المؤشر الجافا الثالث: المحدد_للقائمة.

جافا المحدد_للقائمة

مثل المتكرر، المحدد_للقائمة هو متكرر جافا، يُستخدم لتكرار العناصر واحدًا تلو الآخر من كائن قائمة.

  • هو متاح منذ جافا 1.2.
  • يمتد من واجهة المتكرر.
  • إنه مفيد فقط لفئات القوائم المنفذة.
  • على عكس المتكرر، فهو يدعم جميع العمليات الأربع: إنشاء، قراءة، تحديث وحذف.
  • على عكس المتكرر، فهو يدعم كل من التكرار في الاتجاه الأمامي والخلفي.
  • إنه متكرر ثنائي الاتجاه.
  • ليس لديه عنصر حالي؛ موضع المؤشر الخاص به دائمًا بين العنصر الذي سيتم إرجاعه بعد استدعاء previous() والعنصر الذي سيتم إرجاعه بعد استدعاء next().

ملاحظة:- ما هي عمليات CRUD في واجهة تطبيقات مجموعات؟

  • إنشاء: إضافة عناصر جديدة إلى كائن المجموعة.
  • قراءة: استرجاع العناصر من كائن المجموعة.
  • تحديث: تحديث أو تعيين العناصر الحالية في كائن الجمع.
  • حذف: إزالة العناصر من كائن الجمع.

Java ListIterator Class Diagram

في جافا، ListIterator هو واجهة في واجهة برمجة التطبيقات Collection. إنها تمتد من واجهة Iterator. لدعم التكرار في الاتجاهين وعمليات CRUD، يحتوي على الأساليب التالية. يمكننا استخدام هذا Iterator لجميع فئات List المنفذة مثل ArrayList، CopyOnWriteArrayList، LinkedList، Stack، Vector، إلخ. سنستكشف هذه الأساليب بتفصيل مع بعض الأساليب المفيدة في الأقسام القادمة.

أساليب Java ListIterator

تحتوي واجهة Java ListIterator على الأساليب التالية.

  • void add(E e): يقوم بإدراج العنصر المحدد في القائمة.
  • boolean hasNext(): يعيد قيمة صحيحة إذا كان لدى مؤشر القائمة هذا عناصر إضافية عند تكرار القائمة في الاتجاه الأمامي.
  • boolean hasPrevious(): يعيد قيمة صحيحة إذا كان لدى مؤشر القائمة هذا عناصر إضافية عند تكرار القائمة في الاتجاه العكسي.
  • E next(): Returns the next element in the list and advances the cursor position.
  • int nextIndex(): يعيد فهرس العنصر الذي سيتم إرجاعه من خلال استدعاء تاليـ().
  • E previous(): Returns the previous element in the list and moves the cursor position backwards.
  • int previousIndex(): يعيد فهرس العنصر الذي سيتم إرجاعه من خلال استدعاء سابقـ().
  • void remove(): يزيل العنصر الأخير الذي تم إرجاعه من خلال next() أو previous() من القائمة.
  • void set(E e): يستبدل العنصر الأخير الذي تم إرجاعه من خلال next() أو previous() بالعنصر المحدد.

سوف نستكشف هذه الطرق واحدة تلو الأخرى مع أمثلة مفيدة في الأقسام القادمة.

مثال أساسي على ListIterator في جافا

في هذا القسم، سنناقش بعض أساليب ListIterator مع بعض الأمثلة. أولاً، نحتاج إلى فهم كيفية الحصول على هذا الكائن المكرر. كيفية الحصول على ListIterator؟

ListIterator<E> listIterator()

يعيد مكرر القائمة على عناصر هذه القائمة. مثال:-

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(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

أنواع معالجات جافا

كما نعلم، يوجد في جافا أربعة مؤشرات: تعداد، مدرج، ListIterator، وSpliterator. يمكننا تصنيفها إلى نوعين رئيسيين كما هو موضح أدناه:

  • مؤشرات أحادية الاتجاه
    هذه هي المؤشرات التي تدعم فقط التكرار في الاتجاه الأمامي. على سبيل المثال، التعداد، المدرج، إلخ. هي مؤشرات أحادية الاتجاه.- مؤشرات ثنائية الاتجاه
    هذه هي المؤشرات التي تدعم كل من التكرار في الاتجاه الأمامي والاتجاه الخلفي. على سبيل المثال، ListIterator هو مؤشر ثنائي الاتجاه.

كيف يعمل ListIterator في جافا داخلياً؟

كما نعلم، يعمل ListIterator في جافا في كلا الاتجاهين، وهذا يعني أنه يعمل في الاتجاه الأمامي وكذلك الاتجاه الخلفي. إنه مؤشر ثنائي الاتجاه. لدعم هذه الوظيفة، يحتوي على مجموعتين من الأساليب.

  • طرق التكرار في الاتجاه الأمامي
    نحتاج إلى استخدام الطرق التالية لدعم التكرار في الاتجاه الأمامي:
  1. hasNext())
  2. next()
  3. nextIndex()
  • طرق التكرار في الاتجاه الخلفي
    نحتاج إلى استخدام الطرق التالية لدعم التكرار في الاتجاه الخلفي:
  1. hasPrevious()
  2. previous()
  3. previousIndex()

في مشاركتي السابقة، تحدثنا بالفعل عن كيفية عمل Iterator داخليًا في الاتجاه الأمامي في قسم “كيف يعمل Java Iterator داخليًا؟”. حتى ListIterator يعمل بنفس الطريقة. إذا كنت ترغب في الاطلاع على مشاركتي السابقة، يرجى النقر هنا: 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. بعد قراءة العنصر الأول، إذا قمنا بتشغيل قطعة الكود أدناه، فإنها تُرجع قيمة “false”.

namesIterator.hasPrevious();

نظرًا لأن مؤشر ListIterator يشير إلى قبل العنصر الأول من LinkedList، فإن طريقة hasPrevious() تُرجع قيمة خاطئة. بعد مراجعة كل هذه الرسوم التوضيحية، يمكننا القول إن ListIterator في جافا يدعم كلًا من التوجيه الأمامي والخلفي للتكرار كما هو موضح في الرسوم التوضيحية أدناه. لذا فهو معروف أيضًا باسم المؤشر ذو الاتجاهين. مؤشر ListIterator الأمامي مؤشر ListIterator الخلفي

مزايا ListIterator

على عكس Iterator، فإن ListIterator لديه الفوائد التالية:

  • مثل Iterator، فهو يدعم عمليات القراءة والحذف.
  • كما أنه يدعم عمليات الإنشاء والتحديث أيضًا.
  • وهذا يعني أنه يدعم عمليات CRUD: عمليات الإنشاء والقراءة والتحديث والحذف.
  • وهو يدعم كلاً من التوجيه الأمامي والتوجيه الخلفي للتكرار. وهذا يعني أنها مؤشر جافا ثنائي الاتجاه.
  • أسماء الطرق بسيطة وسهلة للاستخدام.

قيود ListIterator

قارن بين Iterator، فإن ListIterator جافا لديه العديد من المزايا. ومع ذلك ، لا تزال لديه بعض القيود التالية.

  • إنها محدد فقط لتنفيذ فئات تنفيذ القائمة.
  • على عكس Iterator، فإنه لا ينطبق على كامل واجهة برمجة تطبيقات المجموعة.
  • إنه ليس مؤشر جافا عام.
  • قارن بين Spliterator، فإنه لا يدعم التكرار المتوازي للعناصر.
  • قارن بين Spliterator، فإنه لا يدعم أداءً أفضل لتكرار حجم كبير من البيانات.

التشابهات بين Iterator و ListIterator

في هذا القسم، سنناقش التشابهات بين مؤشري جافا: Iterator و ListIterator.

  • تم تقديم كل منهما في جافا 1.2.
  • كلاهما مؤشرات تستخدم لتكرار عناصر المجموعة أو القائمة.
  • كلاهما يدعم العمليات “قراءة” و “حذف”.
  • كلاهما يدعم التكرار في الاتجاه الأمامي.
  • كلاهما ليسا واجهات قديمة.

الاختلافات بين 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. المرجع: وثائق API لـ ListIterator

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