View Full Version : سوال: پیدا کردن عدد در رشته
mr_stone
یک شنبه 14 اردیبهشت 1393, 12:19 عصر
سلام بر دوستان
فرض میکنیم یک رشته داریم که همه چیز توش هست!!
حالا ما میخوایم اعداد اون رو جدا کرده و چاپ یا شمارش کنیم!
به نظر شما چیکار کنم!؟
لازم به ذکر هست که منظورم دقیقا عدده نه رقم!
ینی اگر رشته ای داشتیم به این صورت "stone "151557 programming 15 java 1
خروجیش بشه:
151557
15
1
و خروجیه زیر اشتباهه:
1
5
1
5
5
7
1
5
1
storm_saeed
یک شنبه 14 اردیبهشت 1393, 14:33 عصر
public static void main(String[] args) { String tmp = "stone \"151557 programming 15 java 1";
for(int i=0;i<tmp.length();i++){
if(tmp.charAt(i)>='0' && tmp.charAt(i)<='9'){
for(int j=i;j<tmp.length();j++)
{
if( (tmp.charAt(j)<'0' || tmp.charAt(j)>'9') ){
System.out.println("");
i=j;
break;
}
else
System.out.print(tmp.charAt(j));
}
}
}
}
vahid-p
یک شنبه 14 اردیبهشت 1393, 14:45 عصر
میتونی با یک حلقه خودت ابتدا و انتهای اعداد رو مشخص کنی و اونا رو به عنوان subString چاپ کنی. یا مثلا برای اعداد ممیز دار "." رو در نظر بگیری و بگی در صورتی که بعدش باز رقم اومده باشه و... ( همانطور که برای عدد صحیح storm_saeed (http://barnamenevis.org/member.php?228143-storm_saeed) کدش رو نوشتن )
ولی خب راه دیگری که وجود داره استفاده از pattern است. (شاید از نظر بهینه بودن زمان، به اندازه کدی که دوستمون نوشتن بهینه نباشه ولی هر وقت الگو پیچیده میشه به صرفست. از طرفی برای رشته های کوچک زمان چندان محسوس نیست، مگر اینکه رشته طولانی باشه و تعداد دفعات جستجو بالا باشه باید دنبال راه بهینه ای مثل کد بالا بود که اختصاصی نوشته شده باشه )
کد regex اعداد صحیح رو تو اینترنت پیدا کردم ( معلومه شما سرچ نزدید و اول تاپیک زدید ! )، با یکم تغییر در pattern ( الگو ) میتونید اعداد ممیزدار هم تشخیص بدید و هر دو رو استخراج کنه.
اینم کدش :
String s="\"stone \"151557 programming 15. 16.701 java 1";
Pattern p = Pattern.compile("(\\d+\\.\\d+)|(\\d+)"); //integer or floating point
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(m.group());
}
خروجی :
151557
15
16.701
1
حتی اگر مثلا چنین چیزی تو رشته باشه : 16.7.01.1 خودش طبق الگویی که دادیم، اولین نقطه رو ممیز در نظر میگیره. دومین نقطه رو نقطه آخر جمله. سومین نقطه دوباره میشه ممیز چون بعد از عدد 01 اومده. البته انتظار نداشته باشید 01 رو به 1 تبدیل کنه، چون فعلا تو مرحله String است، و با یک تبدیل رشته به اعشاری یا صحیح اینکار هم انجام میشه.
اما در مورد Pattern :
\\d+ میگه تعداد یک یا بیشتری رقم ( digit ) باشه، بعدش \\. یه دونه نقطه، بعدش دوباره یه سری رقم دیگه باشه. "یا" که با "|" مشخص میشه تماما عدد صحیح باشه که میشه \\d+
کلا هر جا یه مقدار خاص و مشخص رو سرچ نمیکنی و دنبال الگویی در رشته هستی ( یعنی سرچ برمبنای الگو هست نه مقدار ) از regex استفاده کن. به صورت بالا. هر دو pattern و matcher تو پکیج regex هستن.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.