هناك العديد من الطرق لاجتياز وحذف العناصر في القائمة أو الخريطة ، وستنشأ المشكلات عند استخدامها بشكل غير صحيح. دعونا نتعلم من هذا المقال أدناه.
1. حذف العناصر أثناء اجتياز القائمة
استخدام الفهرس الترفيهي الترفيهي
مثال: حذف 2 في القائمة
public static void main (string [] args) {list <integer> list = new ArrayList <integer> () ؛ list.add (1) ؛ list.add (2) ؛ list.add (2) ؛ list.add (3) ؛ list.add (4) ؛ لـ (int i = 0 ؛ i <list.size () ؛ i ++) {if (2 == list.get (i)) {list.remove (i) ؛ } system.out.println (list.get (i)) ؛ } system.out.println ("list =" + list.toString ()) ؛ }نتيجة الإخراج:
1234List = [1 ، 2 ، 3 ، 4]
سؤال:
تظهر النتيجة أنه تم حذف واحد فقط 2 ، وتم تفويت الآخر 2. والسبب هو: بعد حذف أول 2 ، يتم تخفيض عدد العناصر في المجموعة بمقدار 1 ، ويتم نقل العناصر اللاحقة إلى الأمام بمقدار 1 بت ، مما يؤدي إلى تفويتها الثانية.
كيفية الاستخدام لتجاوز الحلقة
مثال:
public static void listIratiTerator2 () {list <integer> list = new ArrayList <integer> () ؛ list.add (1) ؛ list.add (2) ؛ list.add (2) ؛ list.add (3) ؛ list.add (4) ؛ لـ (int value: list) {if (2 == value) {list.remove (value) ؛ } system.out.println (value) ؛ } system.out.println (value) ؛ } system.out.println ("list =" + list.toString ()) ؛ }نتيجة:
استثناء في الموضوع "الرئيسي" 12java.util.concurrentModificationexception في java.util.arraylist $ ittr.checkforcomodification (مصدر غير معروف) على java.util.arraylist $ ittr.nextatoratoratoratator.main.main.jain.jain.jain.jain.
يوضح:
وصف ConcurrentModificationException في JDK:
public class ConcurrentModificationException extends
RunTimeException يتم طرح هذا الاستثناء عندما تكتشف الطريقة التعديل المتزامن للكائن ولكنه لا يسمح بهذا التعديل.
على سبيل المثال ، عندما يتكرر مؤشر ترابط على مجموعة ، لا يُسمح عادةً بتعديل خطي آخر. عادة في هذه الحالات ، تكون نتائج التكرار غير مؤكدة. إذا تم اكتشاف هذا السلوك ، فقد تختار بعض تطبيقات التكرار (بما في ذلك جميع تطبيقات المجموعة العامة التي توفرها JRE) إلقاء هذا الاستثناء. يُطلق على التكرار الذي يؤدي هذه العملية تكرار الفشل السريع لأن التكرار يفشل بسرعة كبيرة دون المخاطرة بخطر السلوك غير المؤكد التعسفي في وقت ما في المستقبل.
ملاحظة : لا يشير هذا الاستثناء دائمًا إلى أن الكائن قد تم تعديله بشكل متزامن بواسطة مؤشر ترابط مختلف. إذا أصدر مؤشر ترابط واحد سلسلة من مكالمات الطريقة التي تنتهك عقد الكائن ، فقد يرمي الكائن هذا الاستثناء. على سبيل المثال ، إذا قام مؤشر ترابط بتعديل المجموعة مباشرةً عندما يتكرر على المجموعة باستخدام ITERATOR FAST FAIL ، فسيقوم Iterator بإلقاء هذا الاستثناء.
ملاحظة : لا يمكن ضمان سلوك الفشل السريع للمؤلف ، لأنه بشكل عام ، من المستحيل تقديم أي ضمانات صعبة حول ما إذا كانت هناك أي تعديلات متزامنة خارج المتزامن. ستقوم عملية فشل سريعة ببذل قصارى جهدها لرمي ConcurrentModificationException . لذلك ، من الخطأ كتابة برنامج يعتمد على هذا الاستثناء لتحسين صحة هذه العمليات. الطريقة الصحيحة هي: يجب استخدام ConcurrentModificationException فقط للكشف عن الأخطاء.
لكل في Java يستخدم بالفعل Iterator للمعالجة. لا يسمح ITERATOR بحذف المجموعات أثناء استخدام التكرار. هذا يتسبب في إلقاء التكرار ConcurrentModificationException .
الطريق الصحيح
مثال:
public static void listiTerator3 () {list <integer> list = new ArrayList <integer> () ؛ list.add (1) ؛ list.add (2) ؛ list.add (2) ؛ list.add (3) ؛ list.add (4) ؛ iterator <integer> it = list.iterator () ؛ بينما (it.hasnext ()) {integer value = it.next () ؛ if (2 == value) {it.Remove () ؛ } system.out.println (value) ؛ } system.out.println (value) ؛ } system.out.println ("list =" + list.toString ()) ؛ }نتيجة:
12234List = [1 ، 3 ، 4]
2. حذف العناصر أثناء اجتياز الخريطة
أمثلة على النهج الصحيح:
public static void main (string [] args) {hashmap <string ، string> map = new hashmap <string ، string> () ؛ map.put ("1" ، "test1") ؛ map.put ("2" ، "test2") ؛ map.put ("3" ، "test3") ؛ map.put ("4" ، "test4") ؛ // التمرير الكامل للخريطة لـ (الإدخال <string ، string> الإدخال: map.entryset ()) {system.out.printf ("المفتاح: ٪ s value: ٪ s/r/n" ، intrade.getKey () ، intplic.getValue ()) ؛ }. بينما (it.hasNext ()) {map.entry <string ، string> entry = it.next () ؛ مفتاح السلسلة = intpling.getKey () ؛ int k = integer.parseint (مفتاح) ؛ if (k ٪ 2 == 1) {system.out.printf ("حذف المفتاح: ٪ s القيمة: ٪ s/r/n" ، المفتاح ، intply.getValue ()) ؛ it.remove () ؛ }} // خريطة اجتياز كاملة لـ (إدخال <سلسلة ، سلسلة> إدخال: map.entryset ()) {system.out.printf ("المفتاح: ٪ s القيمة: ٪ s/r/n" ، endring.getKey () ، intradvalue ()) ؛ }}نتيجة:
المفتاح: 1 القيمة: test1key: 2 القيمة: Test2Key: 3 القيمة: Test3key: 4 القيمة: Test4delete المفتاح: 1 القيمة: Test1delete المفتاح: 3 القيمة: Test3key: 2 القيمة: Test2Key: 4 القيمة: Test4
يلاحظ
ولكن هناك أيضًا أشياء نحتاج إلى الانتباه إليها حول طريقة remove() من التكرار:
iterator.next() remove() () إلا مرة واحدة في كل مرة يتم فيها استدعاء طريقة iterator.next ().
قبل استدعاء طريقة remove() ، يجب استدعاء الطريقة next() مرة واحدة.
وصف طريقة إزالة () في JDK-API:
يزيل void remove() العنصر الأخير الذي يتم إرجاعه بواسطة Iterator من المجموعة التي أشار إليها Iterator (العملية الاختيارية). لا يمكن استدعاء هذه الطريقة إلا مرة واحدة لكل مكالمة بعد ذلك. إذا تم تعديل التكرار بطريقة أخرى غير استدعاء هذه الطريقة عند التكرار ، فإن سلوك التكرار غامض.
رميات: UnsupportedOperationException - إذا لم يدعم التكرار عملية remove . IllegalStateException - إذا لم يتم استدعاء الطريقة next ، أو تم استدعاء طريقة remove بعد آخر مكالمة إلى الطريقة next .
لخص
ما سبق هو كل شيء عن حذف العناصر أثناء اجتياز القائمة والخريطة. آمل أن يكون محتوى هذه المقالة من بعض المساعدة في دراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.