جاوا: اسٹرنگ میں لفظ کی موجودگی کی تعداد شمار کریں۔

تعارف

سٹرنگ میں الفاظ کے وقوعات کی تعداد گننا کافی آسان کام ہے، لیکن ایسا کرنے کے کئی طریقے ہیں۔ آپ کو طریقہ کار کی کارکردگی کا بھی حساب دینا ہوگا، کیونکہ آپ عام طور پر خودکار اوزار استعمال کرنا چاہیں گے جب آپ دستی مشقت انجام نہیں دینا چاہتے ہیں - یعنی جب تلاش کی جگہ بڑی ہو۔

اس گائیڈ میں، آپ یہ سیکھیں گے کہ جاوا میں سٹرنگ میں موجود الفاظ کی تعداد کو کیسے گننا ہے:

String searchText = "Your body may be chrome, but the heart never changes. It wants what it wants.";
String targetWord = "wants";

ہم کے واقعات کی تعداد کے لئے تلاش کریں گے targetWord، کا استعمال کرتے ہوئے String.split(), Collections.frequency() اور باقاعدہ اظہار۔

کے ساتھ سٹرنگ میں لفظ کے واقعات کو شمار کریں۔ String.split()

سٹرنگ میں ٹارگٹ ورڈ کی موجودگی کو شمار کرنے کا سب سے آسان طریقہ یہ ہے کہ ہر لفظ پر سٹرنگ کو تقسیم کیا جائے، اور صف کے ذریعے اعادہ کریں، wordCount ہر میچ پر. نوٹ کریں کہ جب کسی لفظ کے ارد گرد کسی بھی قسم کے اوقاف ہوں، جیسے wants. جملے کے آخر میں - سادہ لفظ کی سطح کی تقسیم صحیح طریقے سے علاج کرے گی۔ wants اور wants. الگ الگ الفاظ کے طور پر!

اس کے ارد گرد کام کرنے کے لئے، آپ آسانی سے جملہ سے تمام اوقاف کو ہٹا سکتے ہیں۔ اس سے پہلے اسے تقسیم کرنا:

String[] words = searchText.replaceAll("p{Punct}", "").split(" ");

int wordCount = 0;
for (int i=0; i < words.length; i++)
    if (words[i].equals(targetWord))
        wordCount++;
System.out.println(wordCount);

میں for لوپ، ہم صرف صف کے ذریعے اعادہ کرتے ہیں، یہ جانچتے ہوئے کہ آیا ہر انڈیکس کا عنصر برابر ہے۔ targetWord. اگر یہ ہے، تو ہم اضافہ کرتے ہیں۔ wordCount، جو عملدرآمد کے اختتام پر پرنٹ کرتا ہے:

2

کے ساتھ سٹرنگ میں لفظ کے واقعات کو شمار کریں۔ Collections.frequency()

۔ Collections.frequency() طریقہ ایک بہت صاف ستھرا، اعلیٰ سطحی نفاذ فراہم کرتا ہے، جو ایک سادہ سے خلاصہ کرتا ہے۔ for لوپ، اور دونوں شناخت کے لیے چیک کرتا ہے (چاہے کوئی چیز is ایک اور شے) اور مساوات (چاہے کوئی شے کسی دوسری شے کے برابر ہو، اس چیز کی کوالٹیٹو خصوصیات پر منحصر ہے)۔

۔ frequency() طریقہ تلاش کرنے کے لیے ایک فہرست کو قبول کرتا ہے، اور ٹارگٹ آبجیکٹ، اور دیگر تمام اشیاء کے لیے بھی کام کرتا ہے، جہاں طرز عمل اس بات پر منحصر ہوتا ہے کہ آبجیکٹ خود کیسے لاگو ہوتا ہے۔ equals(). تاروں کی صورت میں، equals() کے لئے چیک کرتا ہے سٹرنگ کے مواد:


searchText = searchText.replaceAll("p{Punct}", "");

int wordCount = Collections.frequency(Arrays.asList(searchText.split(" ")), targetWord);
System.out.println(wordCount);

یہاں، ہم نے حاصل کردہ صف کو تبدیل کر دیا ہے۔ split() جاوا میں ArrayList، مددگار کا استعمال کرتے ہوئے asList() کا طریقہ Arrays کلاس کمی کا آپریشن frequency() کی تعدد کی نشاندہی کرنے والا ایک عدد واپس کرتا ہے۔ targetWord فہرست میں، اور نتائج میں:

2

کے ساتھ سٹرنگ میں لفظ کے واقعات میچر (باقاعدہ اظہار - RegEx)

آخر میں، آپ پیٹرن تلاش کرنے کے لیے ریگولر ایکسپریشنز کا استعمال کر سکتے ہیں، اور مماثل نمونوں کی تعداد گن سکتے ہیں۔ اس کے لیے ریگولر ایکسپریشنز بنائے جاتے ہیں، اس لیے یہ کام کے لیے بہت فطری فٹ ہے۔ جاوا میں، Pattern کلاس کا استعمال ریگولر ایکسپریشنز کی نمائندگی اور مرتب کرنے کے لیے کیا جاتا ہے، اور Matcher کلاس پیٹرن کو تلاش کرنے اور میچ کرنے کے لیے استعمال کیا جاتا ہے۔

RegEx کا استعمال کرتے ہوئے، ہم رموز اوقاف کی تبدیلی کو اظہار میں ہی کوڈ کر سکتے ہیں، اس لیے سٹرنگ کو بیرونی طور پر فارمیٹ کرنے یا رموز اوقاف کو ہٹانے کی ضرورت نہیں ہے، جو کہ بڑی تحریروں کے لیے بہتر ہے جہاں میموری میں دوسرا تبدیل شدہ ورژن ذخیرہ کرنا مہنگا ہو سکتا ہے:

Pattern pattern = Pattern.compile("b%s(?!w)".format(targetWord));

Pattern pattern = Pattern.compile("bwants(?!w)");
Matcher matcher = pattern.matcher(searchText);

int wordCount = 0;
while (matcher.find())
    wordCount++;

System.out.println(wordCount);

اس کا نتیجہ یہ بھی ہوتا ہے:

2

کارکردگی کا بینچ مارک

تو، جو سب سے زیادہ موثر ہے؟ آئیے ایک چھوٹا سا بینچ مارک چلائیں:

int runs = 100000;

long start1 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    int result = countOccurencesWithSplit(searchText, targetWord);
}

long end1 = System.currentTimeMillis();
System.out.println(String.format("Array split approach took: %s miliseconds", end1-start1));

long start2 = System.currentTimeMillis();
  for (int i = 0; i < runs; i++) {
    int result = countOccurencesWithCollections(searchText, targetWord);
}

long end2 = System.currentTimeMillis();
System.out.println(String.format("Collections.frequency() approach took: %s miliseconds", end2-start2));

long start3 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    int result = countOccurencesWithRegex(searchText, targetWord);
}

long end3 = System.currentTimeMillis();
System.out.println(String.format("Regex approach took: %s miliseconds", end3-start3));

ہر طریقہ کو 100000 بار چلایا جائے گا (جتنا زیادہ نمبر ہوگا، فرق اتنا ہی کم ہوگا اور موقع کی وجہ سے نتائج، بڑی تعداد کے قانون کی وجہ سے)۔ اس کوڈ کو چلانے کے نتیجے میں:

Array split approach took: 152 miliseconds
Collections.frequency() approach took: 140 miliseconds
Regex approach took: 92 miliseconds

تاہم – کیا ہوتا ہے اگر ہم تلاش کو بڑا بنا کر کمپیوٹیشنل طور پر زیادہ مہنگا بنا دیں؟ آئیے ایک مصنوعی جملہ بنائیں:

List possibleWords = Arrays.asList("hello", "world ");
StringBuffer searchTextBuffer = new StringBuffer();

for (int i = 0; i < 100; i++) {
    searchTextBuffer.append(String.join(" ", possibleWords));
}
System.out.println(searchTextBuffer);

یہ مواد کے ساتھ ایک تار بناتا ہے:

hello world hello world hello world hello ...

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ Git سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

اب، اگر ہم "ہیلو" یا "دنیا" میں سے کسی ایک کو تلاش کریں تو - پہلے سے دونوں کے مقابلے بہت زیادہ میچز ہوں گے۔ بینچ مارک میں اب ہمارے طریقے کیسے کرتے ہیں؟

Array split approach took: 606 miliseconds
Collections.frequency() approach took: 899 miliseconds
Regex approach took: 801 miliseconds

اب، صف کی تقسیم تیزی سے سامنے آتی ہے! عام طور پر، بینچ مارک مختلف عوامل پر منحصر ہوتے ہیں - جیسے کہ تلاش کی جگہ، ہدف کا لفظ، وغیرہ اور آپ کے ذاتی استعمال کا معاملہ بینچ مارک سے مختلف ہو سکتا ہے۔

مشورہ: اپنے متن پر طریقے آزمائیں، اوقات نوٹ کریں، اور اپنے لیے سب سے زیادہ موثر اور خوبصورت انتخاب کریں۔

نتیجہ

اس مختصر گائیڈ میں، ہم نے جاوا میں ایک سٹرنگ میں، ہدف والے لفظ کے لیے لفظ کے واقعات کو کیسے شمار کیا جائے اس پر ایک نظر ڈالی ہے۔ ہم نے سٹرنگ کو تقسیم کرکے اور ایک سادہ کاؤنٹر کا استعمال کرتے ہوئے شروع کیا ہے، اس کے بعد استعمال کرکے Collections مددگار کلاس، اور آخر میں، باقاعدہ اظہار کا استعمال کرتے ہوئے.

آخر میں، ہم نے طریقوں کو بینچ مارک کیا ہے، اور نوٹ کیا ہے کہ کارکردگی لکیری نہیں ہے، اور تلاش کی جگہ پر منحصر ہے۔ بہت سے مماثلتوں کے ساتھ طویل ان پٹ متن کے لیے، تقسیم کرنے والی صفیں سب سے زیادہ کارآمد معلوم ہوتی ہیں۔ اپنے طور پر تینوں طریقوں کو آزمائیں، اور سب سے زیادہ کارآمد طریقہ منتخب کریں۔

ٹائم اسٹیمپ:

سے زیادہ Stackabuse