vahid-p
سه شنبه 16 اردیبهشت 1393, 20:14 عصر
وقتی که یک ArrayList رو به طریق زیر پیمایش میکنم و در خلال اون به ArrayList اضافه میکنم استثنا از نوع ConcurrentModificationException میده.
for(Production p:prods){
if(p.getLeft()=='c') prods.add(new Production('?',null));
}
چون حین پیمایش به ArrayList اد میکنیم یا حتی حذف میکنیم، اکسپشن میده.
از Iterator که استفاده کنی، remove کار میکنه ولی خب Iterator اد که نداره و اگر هم هنگام استفاده از Iterator و prods.add(...) کنی که باز همون Exception رو میده. از طرفی چون تابع به صورت بازگشتی هی به ArrayList مون اضافه میکنه، فکر میکنم نباید یه ArrayList کمکی استفاده کنم و آخرش کامل به اون Add کنم! ( اینو دقیق نمیدونم فعلا )
به این فکر افتادم خب چه کاریه از ArrayList استفاده کنم، از لینک لیست استفاده میکنم که سایز کل لیست ثابت نیست و به هم لینک شده ( البته arraylist هم ثابت نیست و هنگام add کردن سایزش رو چند برابر میکنه ولی به هر حال مثل آرایست )
ولی برای پیمایش LinkedList خود جاوا اگر از Iterator استفاده کنیم، دوباره امکان add کردن نداریم! مگر اینکه بیام یک LinkedList با وِیژگی هایی که خودم میخوام بسازم. البته تو لینک لیست در صورتی که بنویسم :
while(index<list.size()){
i=list.indexOf(index);
System.out.println(i);
if(i==5){
list.addFirst(50);
}
index++;
}
خروجی :
Size : 10
0
1
2
3
4
5
7
8
9
10
به مشکل بر میخوره ( دلیل استفاده از addFirst این هست که گره های جدیدی که اضافه شدن رو دوباره پردازش نکنه ). مثل اینکه با اضافه کردن به اول لیست، کل index ها رو آپدیت میکنه ( چون 6 رو چاپ نکرد )! ولی خب با add معمولی یا همون addLast مشکلی نداره!
با این وجود شما کدوم رو پیشنهاد میدین؟
for(Production p:prods){
if(p.getLeft()=='c') prods.add(new Production('?',null));
}
چون حین پیمایش به ArrayList اد میکنیم یا حتی حذف میکنیم، اکسپشن میده.
از Iterator که استفاده کنی، remove کار میکنه ولی خب Iterator اد که نداره و اگر هم هنگام استفاده از Iterator و prods.add(...) کنی که باز همون Exception رو میده. از طرفی چون تابع به صورت بازگشتی هی به ArrayList مون اضافه میکنه، فکر میکنم نباید یه ArrayList کمکی استفاده کنم و آخرش کامل به اون Add کنم! ( اینو دقیق نمیدونم فعلا )
به این فکر افتادم خب چه کاریه از ArrayList استفاده کنم، از لینک لیست استفاده میکنم که سایز کل لیست ثابت نیست و به هم لینک شده ( البته arraylist هم ثابت نیست و هنگام add کردن سایزش رو چند برابر میکنه ولی به هر حال مثل آرایست )
ولی برای پیمایش LinkedList خود جاوا اگر از Iterator استفاده کنیم، دوباره امکان add کردن نداریم! مگر اینکه بیام یک LinkedList با وِیژگی هایی که خودم میخوام بسازم. البته تو لینک لیست در صورتی که بنویسم :
while(index<list.size()){
i=list.indexOf(index);
System.out.println(i);
if(i==5){
list.addFirst(50);
}
index++;
}
خروجی :
Size : 10
0
1
2
3
4
5
7
8
9
10
به مشکل بر میخوره ( دلیل استفاده از addFirst این هست که گره های جدیدی که اضافه شدن رو دوباره پردازش نکنه ). مثل اینکه با اضافه کردن به اول لیست، کل index ها رو آپدیت میکنه ( چون 6 رو چاپ نکرد )! ولی خب با add معمولی یا همون addLast مشکلی نداره!
با این وجود شما کدوم رو پیشنهاد میدین؟