View Full Version : سوال: تابع indexof
سایانا
شنبه 13 اردیبهشت 1393, 09:44 صبح
آیا تابع indexof نسبت به اندازه حروف حساسه؟
storm_saeed
شنبه 13 اردیبهشت 1393, 10:28 صبح
منظورتون چیه ؟ indexof به چند نوع overloading شده طبق ورودیمثلا کاراکتر اندیس i ام یک رشته رو میده اگر خارج از رشته باشه Exception میده
برای اطلاع بیشتر
http://www.tutorialspoint.com/java/java_string_indexof.htm
vahid-p
شنبه 13 اردیبهشت 1393, 11:51 صبح
آیا تابع indexof نسبت به اندازه حروف حساسه؟
منظورتون از اندازه حروف همین بزرگ و کوچک بودنه؟ مثلا A و a ؟
بله حساسه. برای اینکه تفاوتی نداشته باشه، میتونی هر دو رشته رو اول به حروف کوچک تبدیل کنی و بعد سرچ کنی. از toLower استفاده کنید.
سوالات خیلی جزئی رو مثل همین چیزی که کاملا مشخص هست رو اول سرچ بزنید ( فارسی یا انگلیسی اما ترجیحا انگلیسی چون برای جاوا منابع فارسی کمه، ولی در عوض منابع انگلیسی خیلی خیلی کاملی وجود داره. مشکلات و باگ هایی گاها باهاش برخورد میکنی که فکر میکنی خودت اولین نفر پیداش کردی ولی اگر خوب سرچ کنی میبینی چقدر رو اون موضوع ریز بحث شده! )
اگر خارج از رشته باشه Exception میده
فکر نکنم. exception نمیده، -1 میده.
storm_saeed
شنبه 13 اردیبهشت 1393, 16:29 عصر
اره اکسپشن نمیده -1 میده حواسم نبود :)
سایانا
شنبه 13 اردیبهشت 1393, 23:10 عصر
خب حالا سوال بالارو به مبحث اصلی ربط میدیم.
مسأله از این قراره که یه برنامه رشته ای مثل این رو دریافت میکنه.(که خب دریافت کردنش مشکلی نیست)
aaaared15487//BlUeBlue4 #1 g h ali
خب خروجیش هم باید اینطوری باشه:
blue 2 red 1
ali 1
15487 1 4 1 1 1 (عدد-تعداد)
من برای شمارششون قصد دارم از indexof استفاده کنم.
اولین مشکل اندازه حروف بود که خب به قول بچه های بالا کل رشته رو به حروف کوچیک تبدیل میکنیم.
دومین مشکل اینه که اگر بخواهیم کلمات رو یکی یکی با تابع indexof پیدا کنیم و بشمریمشون برنامه طولانی میشه و اصلا جالب نیست.پس استفاده از حلقه منطقی تره. مثلا کلمات رو در آرایه قرار بدیم (کلماتی که باید پیدا بشن مشخص هستند) و آرایه رو به تابع indexof بدیم.یه جورایی مثل این:
arr[]={blue,red};
for(int i=0 ; i<r.length(); i++)
{
index= r.indexOf("arr[i]");
if(index!=-1)
{
teadad += 1;
}
}
r همون رشته ایه که دریافت کرده.حالا من نمیدونم میشه چنین کاری رو انجام داد؟آخه یه بار یک متغییر رشته رو که بهش دادم خطا داد. اگه نمیشه راه بهتر سراغ ندارید؟
vahid-p
شنبه 13 اردیبهشت 1393, 23:55 عصر
به نظر من طولانی شدن کد زیاد هم مهم نیست. به نظرم اولویت با اینهاست :
1- برنامت در تمام شرایط درست کار کنه ( به عبارتی باگ نداشته باشه )
2- برنامت در زمان کمتری اجرا بشه
3- حافظه کمتری مصرف کنه
4- کد کمتر
برای برنامه های ساده زیاد نگران زمان، حافظه و کد نباش، مهم اینه درست کار کنه.
خب این کاری که شما میخواهید انجام بدید خیلی راحت با همون تابعی که نوشتم قابل انجامه. شما میگید نمیشه indexOf اینکار رو بکنه؟ خب اینکار رو نمیکنه، پس هیچ؟ خودت میتونی یه تابع بنویسی. کد شما یه اشکالاتی داره و اگر تصحیحش کنید باز به اون کدی که من نوشتم میرسید. دیگه بهینه تر فکر نمیکنم بشه انجام داد ( مگر اینکه بیایید خودتون به جای indexOf یه تابع بنویسید، که نیازی نیست گرچه سادست. راستی اکثر کتابخونه های جاوا ( شاید هم همشون کد منبع باز هستند و راحت میتونید ببینید با چی نوشته شده. کافیه در نت بینز Ctrl رو نگه دارید و روی indexOf کلیک کنید تا به منبعش برید. اونجا هم دوباره رو indexOf کلیک کنید تا به منبعش برسید و کدش رو ببینید )
راستی تو پرانتز بگم یکم کدت مشکلات syntax هم داره که اگه با نت بینز یا اکلیپس بنویسی خودش بهت هشدار میده.
اما در مورد این مثال. من از اون تابعی که قبلا نوشتم ( اینجا (http://barnamenevis.org/showthread.php?450632-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D8%AF%D8%B1-%D8%B1%D8%B4%D8%AA%D9%87&p=2015872&viewfull=1#post2015872) ) استفاده میکنم و کار شما رو اینجوری انجام میدم :
public static void main(String[] args) {
String arr[]={"red","blue","15487","book"};
String exp= "aaaared15487//BlUeBlue4 #1 g h ali";
exp=exp.toLowerCase();
int x;
for (int i=0;i<arr.length;i++) {
x=find(arr[i].toLowerCase(),exp);
System.out.println("("+arr[i]+":"+x+")");
}
}
public static int find(String word,String expression){
int index=-word.length();
int found=-1;
do{
found++;
index=expression.indexOf(word, index+word.length());
}while(index!=-1);
return found;
}
خروجی برنامه :
(red:1)
(blue:2)
(15487:1)
(book:0)
شرح کد :
آرایه و رشته و اینا که گفتی فرض میکنیم گرفته شده.خب اول من میام عبارت اصلی رو یه بار همه رو به حروف کوچک تبدیل میکنم که هر بار نیاز نباشه.
بعد برای تک تک عناصر آرایه arr تابع find ( که تعداد کلمات ظاهر شده در عبارت رو برمیگردونه ) رو فراخوانی میکنه و جواب ها رو چاپ میکنه.
تابع find هم که تو لینکی که دادم توضیح دادم.
تو برنامه نویسی هیچ وقت یه روش و یه راه حل نیست. مثلا اینی که من گفتم شاید یکی بیاد از کتابخونه های آماده استفاده کنه ولی این معمولا چیزی است که تو دروس ازتون میخوان. اگر کلمه های مستقل مورد نظر بود، میتونستید از Map هم استفاده کنید. به این صورت که اول رشته عبارتتون رو با split اونا رو کلمه کلمه کنید و Map ای از کلمات و تعداد تکرارشون به دست بیارید. به هر حال میگم راه حل ها زیاده!
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.