View Full Version : سوال: پیمایش رشته
Ma_Y_R
سه شنبه 06 خرداد 1393, 19:42 عصر
سلام دوستان.میخواستم بدونم چه جوری میشه یه رشته ای رو که داخل arraylist ذخیره شده پیمایش کرد و به اون رشته یک سری علامت اضافه کرد....من یه arraylist دارم که یک سری رشته داخلش ذخیره کردم.حالا میخوام همه ی اینا رو یکی یکی پیمایش کنم و یه سری علامت مثل نقطه بهشون اضافه کنم لطفا کمکم کنید:لبخندساده::لبخندساده:
jrl_golestani
سه شنبه 06 خرداد 1393, 20:03 عصر
سلام دوست عزیز
پیمایش arraylist با foreach هست .
}public class Main
} (public static void main(String[] args
;()< List<String> strs = new ArrayList<String>
;( "strs.add("aaa
; ( "strs.add("bbb
} ( for (String str : strs
;(System.out.println(str
{
{
{
jrl_golestani
سه شنبه 06 خرداد 1393, 20:05 عصر
ببین حالا بستگی به شرطت داره که به کدوم رشته ات میخوای چه اعلانی اضافه کنی . اون شرط را داخل for بذار.
موفق باشی.
Ma_Y_R
سه شنبه 06 خرداد 1393, 20:55 عصر
سلام دوست عزیز
پیمایش arraylist با foreach هست .
}public class Main
} (public static void main(String[] args
;()< List<String> strs = new ArrayList<String>
;( "strs.add("aaa
; ( "strs.add("bbb
} ( for (String str : strs
;(System.out.println(str
{
{
{
گفتید رشته رو با foreach پیمایش کنم.یعنی به جای این for باید foreach قرار بدم؟؟؟؟ لطفا دستور String str : strs رو توضیح بدید:لبخندساده:
Ma_Y_R
سه شنبه 06 خرداد 1393, 21:13 عصر
ببین حالا بستگی به شرطت داره که به کدوم رشته ات میخوای چه اعلانی اضافه کنی . اون شرط را داخل for بذار.
موفق باشی.
ببینید مثلا من چندتا رشته مثل AEdf رو از ورودی میگیرم بعد هر کدوم از این رشته ها رو یکی یکی پیمایش میکنم و پشت هرکدوم یه . میذارم.....
مثلا:
AEdf.
A.Edf
AE.df
AEd.f
.AEdf
حالا من چندتا رشته تو این arraylistم ذخیره کردم که واسه همه باید این مراحلو انجام بدم:لبخندساده:
vahid-p
سه شنبه 06 خرداد 1393, 21:27 عصر
نه foreach همون for ای هست که نوشتن. وقتی که for حالت کلاسیک قبلی رو نداره و اینجوری مینویسیم :
for(String str:strs) بهش میگن foreach . برای آرایه ها، آرای لیست ها و برخی از این قبیل فقط کاربرد داره و خیلی هم خوبه. خودش کل آرایه رو پیمایش میکنه.
البته قابل توجه شما اینکه در جاوا 8 ( که جدیدا اومده ) واقعا چیزی به اسم forEach هم داریم که ساختارش متفاوته ولی عملکردش مشابه است. فعلا حالا سردرگمتون نمیکنم، foreach به همون for که نوشتن میگن.
بخوام خلاصه بگم، اون تکه String str:strs میگه عناصر آرایه ( یا arraylist و ... که از collection ارث بردن ) از نوع String هستند. اگه عدد بود Integer مینوشتی. یعنی چیزی که داخل < > جلو ArrayList نوشتی منظور است. خب حالا بعدیش یه اشاره گر هست به عناصر آرایه که اسمشو گذاشتیم str و فقط داخل همین for معتبره. جلو دو نقطه هم خود آرایه رو بهش میدیم. خودش برای تمامی عناصر for رو اجرا میکنه. حالا میتونید با شرطهایی که داخلش مینویسید حلقه رو کنترل کنید.
Ma_Y_R
سه شنبه 06 خرداد 1393, 21:36 عصر
نه foreach همون for ای هست که نوشتن. وقتی که for حالت کلاسیک قبلی رو نداره و اینجوری مینویسیم :
for(String str:strs) بهش میگن foreach . برای آرایه ها، آرای لیست ها و برخی از این قبیل فقط کاربرد داره و خیلی هم خوبه. خودش کل آرایه رو پیمایش میکنه.
البته قابل توجه شما اینکه در جاوا 8 ( که جدیدا اومده ) واقعا چیزی به اسم forEach هم داریم که ساختارش متفاوته ولی عملکردش مشابه است. فعلا حالا سردرگمتون نمیکنم، foreach به همون for که نوشتن میگن.
بخوام خلاصه بگم، اون تکه String str:strs میگه عناصر آرایه ( یا arraylist و ... که از collection ارث بردن ) از نوع String هستند. اگه عدد بود Integer مینوشتی. یعنی چیزی که داخل < > جلو ArrayList نوشتی منظور است. خب حالا بعدیش یه اشاره گر هست به عناصر آرایه که اسمشو گذاشتیم str و فقط داخل همین for معتبره. جلو دو نقطه هم خود آرایه رو بهش میدیم. خودش برای تمامی عناصر for رو اجرا میکنه. حالا میتونید با شرطهایی که داخلش مینویسید حلقه رو کنترل کنید.
میشه با همین for فقط یه کاراکتر جلو بریم؟؟؟ نمیدونم چه جورب بنویسمش.......همون طور که بالا توضیح دادم رشتم اون طوری تغییر میکنه...پس باید یه متغیر داشته باشم که در هر مرحله زیاد بشه ولی نمیدونم چه جوری.
vahid-p
سه شنبه 06 خرداد 1393, 21:38 عصر
اگر هم درکش براتون یکم مشکله، از همون for های معمولی استفاده کنید. یعنی
for(int i=0;i<strs.size();i++){
strs.get(i);
}
که البته پیشنهاد خود جاوا استفاده از foreach هست.
راستی شما اگر بخواید در یک آرای لیست هنگام پیمایش عناصری رو اضافه یا کم کنید با اررور برخورد میکنید. بهتره از ListIterator استفاده کنید. یا هم از یک لیست کمکی استفاده کنید و هنگام پیمایش رشته های جدید رو به لیست کمکی اضافه کنید و پس از اتمام حلقه، لیست کمکی رو جایگزین لیست قبلی یا به لیست قبلی اضافه کنید ( بسته به چیزی که میخواید ). وگرنه با این روش شما نمیتونید رشته های جدیدی رو هنگام پیمایش اضافه یا کم کنید. ( این خصوصیت ArrayList هست و کاریش هم نمیشه کرد، حتی Vector هم این مسئله رو داره ). دلیلش اینه وقتی داره پیمایش میکنه شما یه عنصر رو بخواید حذف کنید، قاطی میکنه دیگه :) - اینجا مفصلا بحثشو کردیم : http://barnamenevis.org/showthread.php?451233-Add-%DA%A9%D8%B1%D8%AF%D9%86-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%D9%BE%DB%8C%D9%85%D8%A7%DB%8C%D8%B4-ArrayList-%D9%88-ConcurrentModificationException-%DB%8C%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-LinkedList-%D8%9F%D8%9F%D8%9F
پس دو راه هست : لیست کمکی ( ArrayList<String> temp )
یا استفاده از ListIterator
حتی Iterator معمولی هم کمکی بهتون نمیکنه. چون با Iterator معمولی میتونید یه عنصر رو حذف کنید ولی نمیتونید اضافه کنید ( باز همون خطا رو میده )
روش اول ( لیست کمکی ):
ArrayList<String> temp=new ArrayList<>();
for(String str:strs){
temp.add("."+str);
}
//یکی از این دو
//1
strs.addAll(temp);
//2
strs=temp;
روش دوم ( ListIterator ) : ( مقادیر قبلی جایگزین میشن - set جایگزین میکنه، میخوای مقادیر قبلی باقی بمونن از add استفاده کن بجاش )
ListIterator<String> it=strs.listIterator();
while(it.hasNext()){
it.set("."+it.next());
}
Tiyana
سه شنبه 06 خرداد 1393, 21:41 عصر
دوست عزیز کاربر for each به این صورت هست که تا زمانی که درون آرایه یا یک لیست عنصری قرار داره اون عنصر ها به ترتیب در یک متغیر هم نوع خودشون ذخیره میشن و با این کار میتونیم روی اون متغیر کار پردازشیمونو انجام بدیم مثلا فرض کن ما آرایه ای از اعداد داریم و میخوایم توی حلقه دونه به دونه هر کدوم رو چاپ کنیم تو این حلقه با شروع از عنصر اول آرایه یعنی numbers[0] اعداد در هر مرحله درون num ریخته میشه و بعد شرط درون حلقه روی num اجرا میشه وقتی بلاک حلقه تموم میشه دوباره میریم اول حلقه و شمارنده آرایه خود به خود یکی اضافه میشه و این کار تا وقتی ادامه پیدا میکنه که عناصر داخل آرایمون تموم بشن خوبی for each اینه که نیازی نیست برای اون گام حلقه تعیین کنیم یا آخر آرایه رو بدست بیاریم اما در بعضی اوقات هم مجبوریم که از for معمولی استفاده کنیم وقتایی که ما احتیاج داریم تا اگر شمارنده به یه مقدار خواصی رسید حلقه break بشه یا اونو continue کنیم....
for(int num: numbers)
System.out.println(num);
اما در مورد الگوریتمتون من دقیقا متوجه نشدم باید چیکار کنیم یعنی ما همه عناصرمون مثل همه که باید یکی یکی نقطه بره جلو یا اینکه میتونن مختلف باشن و این نقطه گذاری چه زمانی برمیگرده به کاراکتر اول؟
Ma_Y_R
سه شنبه 06 خرداد 1393, 21:44 عصر
اگر هم درکش براتون یکم مشکله، از همون for های معمولی استفاده کنید. یعنی
for(int i=0;i<strs.size();i++){
strs.get(i);
}
که البته پیشنهاد خود جاوا استفاده از foreach هست.
راستی شما اگر بخواید در یک آرای لیست هنگام پیمایش عناصری رو اضافه یا کم کنید با اررور برخورد میکنید. بهتره از ListIterator استفاده کنید. یا هم از یک لیست کمکی استفاده کنید و هنگام پیمایش رشته های جدید رو به لیست کمکی اضافه کنید و پس از اتمام حلقه، لیست کمکی رو جایگزین لیست قبلی یا به لیست قبلی اضافه کنید ( بسته به چیزی که میخواید ). وگرنه با این روش شما نمیتونید رشته های جدیدی رو هنگام پیمایش اضافه یا کم کنید. ( این خصوصیت ArrayList هست و کاریش هم نمیشه کرد، حتی Vector هم این مسئله رو داره ). دلیلش اینه وقتی داره پیمایش میکنه شما یه عنصر رو بخواید حذف کنید، قاطی میکنه دیگه :)
پس دو راه هست : لیست کمکی ( ArrayList<String> temp )
یا استفاده از ListIterator
حتی Iterator معمولی هم کمکی بهتون نمیکنه. چون با Iterator معمولی میتونید یه عنصر رو حذف کنید ولی نمیتونید اضافه کنید ( باز همون خطا رو میده )
به نظر شما از چی استفاده کنم بهتره؟؟؟
من میخوام یه تعدادی رشته رو که تعدادشم متغیره جایی ذخیره کنم و در هر مرحله یه سری علامت کنارشون بزارم که این ممکنه تا چندین مرحله تکرار بشه.خودم هم تو انتخاب arraylist مردد بودم:متفکر:
vahid-p
سه شنبه 06 خرداد 1393, 21:52 عصر
پست قبلی رو آپدیت کردم. نحوه استفاده از هر دو تاشو نوشتم.
اما پیشنهاد من برای مشکلی که ممکن است تکرار مکررات شود و برنامتون جواب لازم رو بهتون نده ( چون گفتید تو در تو انجام بشه ) استفاده از لیست کمکی است که درکش هم راحتتره.
شما هر چی میخواد اضافه بشه رو تو یه آرایه جدید بریزید و آخرش به آرایه قبلیتون addAll کنید.
حالا هر چند مرحله میخواد باشه.
vahid-p
سه شنبه 06 خرداد 1393, 22:08 عصر
اگه درست فهمیده باشم شما چنین چیزی میخواید :
ArrayList<String> strs = new ArrayList<>();
strs.add("One");
strs.add("Two");
strs.add("Three");
ArrayList<String> temp = new ArrayList<>();
for (String str : strs) {
change(str, temp, str.length());
}
//یکی از این دو
//1
// strs.addAll(temp);
//2
strs = temp;
for (String str : strs) {
System.out.println(str);
}
اینم متد change ( به صورت بازگشتی ):
public static void change(String str, ArrayList<String> tempArray, int depth) {
if (depth <0) return;
tempArray.add(str.substring(0, depth) + "." + str.substring(depth, str.length()));
change(str, tempArray, depth-1);
}
خروجی :
One.
On.e
O.ne
.One
Two.
Tw.o
T.wo
.Two
Three.
Thre.e
Thr.ee
Th.ree
T.hree
.Three
Ma_Y_R
سه شنبه 06 خرداد 1393, 22:23 عصر
اگه درست فهمیده باشم شما چنین چیزی میخواید :
ArrayList<String> strs = new ArrayList<>();
strs.add("One");
strs.add("Two");
strs.add("Three");
ArrayList<String> temp = new ArrayList<>();
for (String str : strs) {
change(str, temp, str.length());
}
//یکی از این دو
//1
// strs.addAll(temp);
//2
strs = temp;
for (String str : strs) {
System.out.println(str);
}
اینم متد change ( به صورت بازگشتی ):
public static void change(String str, ArrayList<String> tempArray, int depth) {
if (depth <0) return;
tempArray.add(str.substring(0, depth) + "." + str.substring(depth, str.length()));
change(str, tempArray, depth-1);
}
خروجی :
One.
On.e
O.ne
.One
Two.
Tw.o
T.wo
.Two
Three.
Thre.e
Thr.ee
Th.ree
T.hree
.Three
درواقع نمیخوام که همه رو پشت هم نقطه گذاری کنه.....میخوام هر وقت که این متد فراخوانی شد اول همه ی رشته ها رو نقطه بزاره.....دفعه ی بعد حرف دوم وهمین طور نقطه ها یدونه جلو برن .این که نقطه پشت چه حرفی باشه مهمه....باید بررسی بشه و یه سری عملیات مشابه دیگه ای انجام بشه
vahid-p
سه شنبه 06 خرداد 1393, 23:23 عصر
متوجه نشدم. خب الان که مفاهیم لازم رو میدونید خودتون بنویسید سریعتر از این انجام میشه تا ما رو توجیه کنید، جاییش مشکل بود بگید! به هر حال هر جاشو میخوای نقطه بذاری موقعیتش رو به depth بده و
tempArray.add(str.substring(0, depth) + "." + str.substring(depth, str.length()));
موفق باشید
Ma_Y_R
سه شنبه 06 خرداد 1393, 23:48 عصر
متوجه نشدم. خب الان که مفاهیم لازم رو میدونید خودتون بنویسید سریعتر از این انجام میشه تا ما رو توجیه کنید، جاییش مشکل بود بگید! به هر حال هر جاشو میخوای نقطه بذاری موقعیتش رو به depth بده و
tempArray.add(str.substring(0, depth) + "." + str.substring(depth, str.length()));
موفق باشید
میشه بگید این یه خط کد دقیقا چیکار میکننه؟؟؟
0 واسه چیه؟؟
(() str.substring(depth, str.length ؟؟
vahid-p
سه شنبه 06 خرداد 1393, 23:59 عصر
این میاد اونجایی که میخوای نقطه اضافه میکنه. اگر به JavaDoc متد subString نگاه کنید، اول اندیس شروع است و دومی اندیس خاتمه ( توجه اینکه تا خود اندیس خاتمه نیست و تا یکی قبلش هست endIndex-1 )
داره میگه کاراکترهای اندیس 0 تا depth-1 رو قبل از نقطه و بعدش رو بعد از نقطه قرار بده. همون چیزی که خودتون گفتید. پس چطوری میخواستید وسطش نقطه بذارید؟!
Ma_Y_R
چهارشنبه 07 خرداد 1393, 00:13 صبح
for(String str : strs) {
change(str, temp, str.length());
}
این قسمت فقط میخوام یه بار اجرا بشه....پس نمیتونم از str استفاده کنم.چطور میتونم طول هر رشته رو برگردونم؟؟؟
vahid-p
چهارشنبه 07 خرداد 1393, 00:31 صبح
خداییش من نمیفهمم گیر کار کجاست.
برای اینکه یه بار اجرا بشه خب ، تو متد change خط آخر رو حذف کن. گرچه اونوقت باز میگم حواست به depth باشه.
public static void change(String str, ArrayList<String> tempArray, int depth) {
if (depth <0) return;
tempArray.add(str.substring(0, depth) + "." + str.substring(depth, str.length()));
}
طول رشته با متد length() که تو متد هم ازش استفاده شده.
Ma_Y_R
چهارشنبه 07 خرداد 1393, 00:49 صبح
خدا رو شکر با کمک شما مشکلم تا حدودی حل شد .
vahid-p
چهارشنبه 07 خرداد 1393, 01:00 صبح
جاوا اینقدر منظم و مرتب نوشتن که از رو خود اسم متد ها میشه تشخیص داد. کافیه اگر از IDE استفاده میکنید، وقتی مینویسید str و . میذارید، خودش توابع رو میاره.
هر کاراکتر توسط charAt میتونید بگیرید.
charAt(i) کاراکتر با اندیس i رو برمیگردونه. تازه از مقدار برگشتی متد ها هم میتونید تشخیص بدین کدوم چی هست.
تمام اطلاعات و متدهای مربوط به کلاس String :
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
که البته تو netbeans اینا هم جاواداک همراه کتابخونه لود میکنه و تو برنامه حین کد نویسی برات میاره.
Ma_Y_R
چهارشنبه 07 خرداد 1393, 11:48 صبح
درواقع چیزی که میخوام بنویسم یه پارسره............از ورودی یه سری گرامر میگیره مثل:
A-->Bad
B-->Sde
B-->id
که اینارو تو arraylist ذخیره کردم.......بعدش اولین رشته رو نقطه گذاری میکنه یعنی:A-->.Bad حالا اگه این نقطه پشت یه کاراکتر بزرگ باشه،همه ی رشته هایی رو که با اون کاراکتر شروع شده رو باید یه جای دیگه ذخیره کنه و نقطه ی همین رشته رو یدونه جلو ببره یعنی:
A-->B.ad
B-->.Sde
B-->.id
اینا باید تو یه مکان دیگه ای ذخیره بشن......بعد همین کار رو واسه این گروه از رشته ها تکرار میکنیم......هر کروم از این گروه ها هم باید یه شماره ای داشته باشن که بعد بشه ازشون استفاده کرد......حالا من نمیدونم چه جوری باید اینو پیاده کنم...............خیلی سردرگمم......:متفکر::متفکر:
vahid-p
چهارشنبه 07 خرداد 1393, 16:27 عصر
:لبخند:
از اواسط تاپیک حدس میزدم همین قضیه گرامر ها باشه. درس تئوری زبانها درسته؟ (شایدم کامپایلر باشه که در ترم های آتی میخونم )
دو تا از این قبیل برنامه ها ( تبدیل NDFA به DFA و حذف قواعد اضافه لاندا، واحد و... ) رو نوشتم، و از همین روش ها استفاده کردم فقط به صورت بازگشتی نوشتم که کارمو ساده کنم. شما هم فکر کنم همین کارو باید بکنید.
این چیزی که شما میخواید روش خودتون هست که یه نقطه پشتش بذارید یا روشی هست که همه جا پیشنهاد داده شده؟ تو اینترنت سرچ کردین؟
چون چیزی که میگید کار سختی نیست، فقط یه سری دسته بندی داره که به نظر میاد هنوز واسه خودتون هم اونطور که لازمه واضح نیست برای همین توضیحی که دادید باز یکم مبهمه.
مثلا شما گفتید رشته هایی که با اون کاراکتر شروع شدن، به یه لیست اضافه میشن. خب سوال اول اینکه همه رشته هایی که از A نتیجه میشن یا از B و... هم تو همین دسته میان یا هر کدوم جدا؟ چون اگه همه میان که دیگه سمت چپ قاعده مهم نیست.
دوم اینکه مثلا فرض کنید B.Ad باشه
BAS
AaD
SAd
از بین اینا کدوما تو دسته بندی میان؟
بعد دسته بندی ها چند سطحی هستند؟ یعنی مثلا میاییم بین اونایی که اولشون B بوده دوباره بر اساس حرف دوم بزرگ دسته بندی میکنیم؟
ولی فکر کنم کسی که با مفهومی که میگید آشنا باشه بهتره راهنمایی کنه، چون دیگه این سوالات براش پیش نمیاد
Ma_Y_R
چهارشنبه 07 خرداد 1393, 22:11 عصر
همون طور که حدس زدید کامپایلره و بازم همون طور که متوجه شدید واسه ی خودم هم واضح نیست....این روش، روش من نیست.....اینا یه سری پارسر هستند که یه همچین روش هایی دارن....ما هم باید یه جورایی اونو شبیه سازی کنیم.......
همین dfa که گفتین هم بهم کمک میکنه...ولی نوشتنشو نمیدونم....خوشحال میشم اگه راهنماییم کنید که چه جوری یه dfa بنویسم.....
اگه لطف کنید و ایمیلتون رو بهم بدید توضیح کاملشو میفرستم براتون...چون واقعا وقتم کمه و به کمکتون نیاز دارم.:لبخندساده::لبخندساده:
vahid-p
پنج شنبه 08 خرداد 1393, 01:37 صبح
متاسفانه چون کامپایلر نداشتم، مطمئنا تا متوجه بشم وقت گیر میگیره و شنبه امتحان دارم.
به نظرم از بقیه دوستانی که قبلا پاس کردن راهنمایی بگیرید. از طریق پیغام خصوصی براتون اسامی رو میفرستم )
Ma_Y_R
پنج شنبه 08 خرداد 1393, 10:46 صبح
متاسفانه چون کامپایلر نداشتم، مطمئنا تا متوجه بشم وقت گیر میگیره و شنبه امتحان دارم.
به نظرم از بقیه دوستانی که قبلا پاس کردن راهنمایی بگیرید. از طریق پیغام خصوصی براتون اسامی رو میفرستم )
ممنونم از کمکتون.....لطفا اگه برنامه ای در مورد رسم dfa دارید در اختیارم قرار بدید فکر میکنم بهم کمک کنه...:متفکر:
vahid-p
پنج شنبه 08 خرداد 1393, 15:30 عصر
رسم DFA ندارم.
اسامی رو پیغام خصوصی کردم، ببخشید دیر شد.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.