PDA

View Full Version : سوال: جدا کردن کلمه ها بدون تکرار از متن



mehrdad1991h
دوشنبه 23 اردیبهشت 1392, 10:28 صبح
سلام
یک متن دارم
میخوام از همین متن کل کلمه هاش را جدا کنم به صورتی که داخلش کلمه تکراری وجود نداشته باشه

نمونه
متن : " سلام اسم من مهرداد است و اسم دوست من هم مهرداداست که دوست قلی و من است"
خروجی : " سلام - اسم - من - مهرداد - است - و - دوست - هم - که - قلی"

خوب برای این کار چندتا کار میشه کرد ولی من دنبال بهترین و سریع ترین هستم

یه چند نمونه کد برا اینکه تعداد تکرار را بتونیم به دست بیاریم
نمونه کد 1 :

string source = txt1.Text;
string Search = txt2.Text;
int count = 0; int n = 0; while ((n = source.IndexOf(Search, n)) != -1) { n++; count++; }

نمونه 2 :

int count = new Regex(needle).Matches(haystack).Count;


نمونه کد 3 :
var count = source.Count(c => c == "Search");نمونه 4 :
int count = source.Split(new string[] {"Search"},StringSplitOptions.None).Length - 1;

که من فکر میکنم کد 3 و 4 بهترین انتخاب ها میتونن باشند
خوب الان این ها به کنار من چجوری این ها را جدا کنم
بیام اول کل متن را با اسپیلیت کنم با کاراکتر اسپیس و بریزم تو یک ارایه و دونه دونه هر کلمه را چک کنم ببینم چند بار تکرار شده تازه بعدش دوباره از طریق تکرار ها بیام یکیشون را انتخاب کنم و.... این روند کندی میشه

لطفا پیشنهاد بدید من چه کنم
سپاس

مهرداد صفا
دوشنبه 23 اردیبهشت 1392, 11:17 صبح
با سلام.
تاپیک زیر را بررسی کنید:
تابع بیشترین تکرار در یک فیلد (http://barnamenevis.org/showthread.php?373994-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF)

mehrdad1991h
دوشنبه 23 اردیبهشت 1392, 11:39 صبح
با سلام.
تاپیک زیر را بررسی کنید:
تابع بیشترین تکرار در یک فیلد (http://barnamenevis.org/showthread.php?373994-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF)

بسیار متشکرم
حل شد کارم:لبخندساده: میدونستم با LINQ میشه ولی بلد نبودم درست چون درست LINQ بلد نیستم
سپاس

_behnam_
دوشنبه 23 اردیبهشت 1392, 11:48 صبح
سلام.
برای این کاری که شما مد نظرتون هست یکی از راه ها اینه که شما بیاید جمله رو بر اساس فاصله (space) مجموع آرایه بدست اومده از Split رو توی یک لیست آرایه بریزید. بعد یک حلقه معکوس از تعداد آرایه منهای یک تا صفر بسازید و توی اون مقدار المانی که اندیسش برابر هست با ادیس حلقه یکی یکی المان های لیست رو چک کنید و اگر برابر بود المان را پاک کنید.

mehrdad1991h
دوشنبه 23 اردیبهشت 1392, 12:05 عصر
سلام.
برای این کاری که شما مد نظرتون هست یکی از راه ها اینه که شما بیاید جمله رو بر اساس فاصله (space) مجموع آرایه بدست اومده از Split رو توی یک لیست آرایه بریزید. بعد یک حلقه معکوس از تعداد آرایه منهای یک تا صفر بسازید و توی اون مقدار المانی که اندیسش برابر هست با ادیس حلقه یکی یکی المان های لیست رو چک کنید و اگر برابر بود المان را پاک کنید.

خوب وقتی با LINQ اینقدر راحت میشه این کار را انجام داد
و خیلی هم سریع نتیجه را میگیری
دیگه چه نیازی هست لقمه را اینقدر دور سرمون بگردونیم ؟ در ضمن من هم دنبال سریع ترین روش بودم که همون LINQ سریع تر عمل میکنه تا اینکه بیایک حلقه بنویسیم و دونه دونه چک کنیم و ....
در همین تاپیکی که دوستمون اعلام نمودند (http://barnamenevis.org/showthread.php?373994-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF) راه حل خیلی واضح و روشن مشخصه
فقط دلیلی که این تاپیک را پاک نمیکنم اینه که اون اولش هم من 4 تا کد نوشتم و عنوان تاپیک من متفاوت هست ممکنه در اینده به کار شخص دیگه ای هم بیاد ...
از همگی متشکرم

tooraj_azizi_1035
دوشنبه 23 اردیبهشت 1392, 18:48 عصر
و البته سریعتر از LINQ:


str = "cats cats cats and dogs dogs dogs and cats cats and dogs dogs";
str = Regex.Replace(str, @"(\b\w+\b)\s+(\1(\s+|$))+", "$1 ");
Console.WriteLine(str);

mehrdad1991h
دوشنبه 23 اردیبهشت 1392, 20:29 عصر
و البته سریعتر از LINQ:


str = "cats cats cats and dogs dogs dogs and cats cats and dogs dogs";
str = Regex.Replace(str, @"(\b\w+\b)\s+(\1(\s+|$))+", "$1 ");
Console.WriteLine(str);

:متعجب:
اقا میشه همین خط دوش را توضیح بدید ؟
خوب از regex استفاده کردی ولی بعدش چی شد ؟
@"(\b\w+\b)\s+(\1(\s+|$))+"
و
$1
چی شد الان ؟ کار دادن که باشه قبول کار میده ولی میخوام بدونم چجوری شده تا فردا یه جا دیگه هم خواستم بتونم استفاده کنم
\w+ که یعنی همه کاراکتر های حرفی و عدیدی که یک بار یا بیشتر تکرار شده باشند
\s+ هم یعنی اسپیس یک بار یا بیشتر خورده باشه (این همون قسمت جدا کننده ی کلمه ها هست فک کنم)

\b هم فکر کنم همون کاراکتر خالی میشه !!!

سوال های من ؟

@ اولش برا چیه ؟
چرا از \b استفاده کردیم اصلا ؟ و (سوال شخصی تفاوت اون با \B در چیه ؟)
حالا چرا اومدیم اسپیس را با خط جایگزین کردیم ؟ ( این منظورمه(\s+|$) )
\1 چیه ؟ ته این قسمت چرا + اومده ؟ + که میاد میگه یه بار یا بیشتر تکرار شده باشه....
اون اخرین قسمت $1 چیه و چیکار میکنه ؟ $ یعنی خط یا پایان رشته.

میشه این قسمتی که نوشتین را 2 خط توضیح بدین من لازمش دارم توضیحش بیشتر الان برام مهمه تا خود کدش :افسرده:

tooraj_azizi_1035
دوشنبه 23 اردیبهشت 1392, 20:40 عصر
@ برای اینه که کامپایلر با رشته به عنوان رشته Verbatimرفتار کنه و \ های داخل رو به عنوان کاراکتر عادی ببینه. چون برای \ باید دوبار \ بگذاریم. بدون اون امتحان کنید.
\b قلمرو شروع یک کلمه است.
بیشتر: http://msdn.microsoft.com/en-us/library/hs600312.aspx

به زودی در Farsimsdn راهنمای کامل عبارات باقاعده رو قرار می دم.

_behnam_
سه شنبه 24 اردیبهشت 1392, 15:52 عصر
خوب وقتی با LINQ اینقدر راحت میشه این کار را انجام داد
و خیلی هم سریع نتیجه را میگیری
دیگه چه نیازی هست لقمه را اینقدر دور سرمون بگردونیم ؟ در ضمن من هم دنبال سریع ترین روش بودم که همون LINQ سریع تر عمل میکنه تا اینکه بیایک حلقه بنویسیم و دونه دونه چک کنیم و ....
در همین تاپیکی که دوستمون اعلام نمودند (http://barnamenevis.org/showthread.php?373994-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF) راه حل خیلی واضح و روشن مشخصه
فقط دلیلی که این تاپیک را پاک نمیکنم اینه که اون اولش هم من 4 تا کد نوشتم و عنوان تاپیک من متفاوت هست ممکنه در اینده به کار شخص دیگه ای هم بیاد ...
از همگی متشکرم
دوست عزیز LINQ هم به وسیله حلقه جستجو میکند.
(اگر ساختمان داده را پاس کرده باشید متوجه منظورم میشوید)

_behnam_
سه شنبه 24 اردیبهشت 1392, 15:59 عصر
در ضمن دوست عزیز : هیچوقت تعداد خط کدهای نوشته شده نشانگر سرعت اجرا نیست. بستگی به کدهای درون متد دارد، شاید متدی که استفاده شده پیچیدگی زمانی بسیار بالایی داشته باشد.
(منظورم به کد تورج عزیزی نیست،کلی گفتم)