JavaRush /جاوا بلاگ /Random-UR /جاوا میں سٹرنگ کو تبدیل کریں۔

جاوا میں سٹرنگ کو تبدیل کریں۔

گروپ میں شائع ہوا۔
پروگرامر کے کام میں، اکثر کچھ کام یا ان کے اجزاء کو دہرایا جا سکتا ہے۔ اس لیے، آج میں ایک ایسے موضوع پر بات کرنا چاہوں گا جس کا سامنا کسی بھی جاوا ڈویلپر کے روزمرہ کے کام میں ہوتا ہے۔ جاوا میں سٹرنگ کو تبدیل کریں - 1آئیے فرض کریں کہ آپ کو ایک مخصوص طریقہ سے ایک خاص تار موصول ہوتا ہے۔ اور اس کے بارے میں سب کچھ اچھا لگتا ہے، لیکن کچھ چھوٹی چیز ہے جو آپ کے مطابق نہیں ہے. مثال کے طور پر، الگ کرنے والا موزوں نہیں ہے، اور آپ کو کسی اور کی ضرورت ہے (یا بالکل نہیں)۔ ایسی صورت حال میں کیا کیا جا سکتا ہے؟ replaceقدرتی طور پر، کلاس کے طریقے استعمال کریں String۔

جاوا سٹرنگ کو تبدیل کریں۔

قسم آبجیکٹ Stringمیں متبادل طریقہ کی چار تغیرات ہیں replace:
  • replace(char, char);
  • replace(CharSequence, CharSequence);
  • replaceFirst(String, String);
  • replaceAll(String, String).
ان تمام طریقوں کا مقصد ایک ہی ہے - سٹرنگ کے کچھ حصے کو دوسری سٹرنگ سے بدلنا۔ آئیے ان پر ایک قریبی نظر ڈالتے ہیں۔ 1.replace(char, char) String replace(char oldChar, char newChar) - پہلی دلیل کے کردار کے تمام واقعات کو oldCharدوسری سے بدل دیتا ہے newChar۔ اس مثال میں، ہم کوما کو سیمی کالون سے بدل دیں گے:
String value = "In JavaRush, Diego the best, Diego is Java God".replace(',', ';');
System.out.println(value);
کنسول آؤٹ پٹ:
In JavaRush; Diego the best; Diego is Java God
2.replace(CharSequence, CharSequence) ایک سٹرنگ کے ہر ذیلی اسٹرنگ کو بدلتا ہے جو حروف کی ایک مخصوص ترتیب سے متبادل حروف کی ترتیب سے میل کھاتا ہے۔
String value = "In JavaRush, Diego the best, Diego is Java God".replace("Java", "Rush");
System.out.println(value);
نتیجہ:
In RushRush, Diego the best, Diego is Rush God
3.replaceFirst(String, String) String replaceFirst(String regex, String replacement) - پہلے ذیلی اسٹرنگ کو تبدیل کرتا ہے جو مخصوص ریگولر ایکسپریشن سے مماثل متبادل سٹرنگ سے ملتا ہے۔ غلط ریگولر ایکسپریشن کا استعمال کرتے وقت، آپ ایک PatternSyntaxException پکڑ سکتے ہیں (جو کہ اچھی چیز نہیں ہے)۔ اس مثال میں، آئیے چیمپیئن روبوٹ کا نام بدلتے ہیں:
String value = "In JavaRush, Diego the best, Diego is Java God".replaceFirst("Diego", "Amigo");
System.out.println(value);
کنسول آؤٹ پٹ:
In JavaRush, Amigo the best, Diego is Java God
جیسا کہ ہم دیکھ سکتے ہیں، "ڈیاگو" کا صرف پہلا اندراج تبدیل ہوا ہے، لیکن اس کے بعد کے اندراج باقی رہ گئے - یعنی، اچھوتا۔ 4. replaceAll()جاوا میں - یہ طریقہ سٹرنگ String replaceAll(String regex, String replacement)میں سب اسٹرنگ کے تمام واقعات کی جگہ لے لیتا ہے ۔ ایک باقاعدہ اظہار کو پہلی دلیل کے طور پر استعمال کیا جا سکتا ہے ۔ مثال کے طور پر، آئیے ناموں کے ساتھ سابقہ ​​متبادل کو انجام دینے کی کوشش کریں، لیکن ایک نئے طریقہ کے ساتھ: regexreplacementregex
String value = "In JavaRush, Diego the best, Diego is Java God".replaceAll("Diego", "Amigo");
System.out.println(value);
کنسول آؤٹ پٹ:
In JavaRush, Amigo the best, Amigo is Java God
جیسا کہ ہم دیکھ سکتے ہیں، تمام علامتوں کو مکمل طور پر ضروری علامتوں سے بدل دیا گیا ہے۔ مجھے لگتا ہے کہ امیگو خوش ہوں گے =)

باقاعدہ اظہار

اوپر کہا گیا تھا کہ ریگولر ایکسپریشن کا استعمال کرتے ہوئے اسے تبدیل کرنا ممکن ہے۔ سب سے پہلے، ہم اپنے لیے واضح کرتے ہیں کہ باقاعدہ اظہار کیا ہے؟ ریگولر ایکسپریشنز میٹا کریکٹرز (وائلڈ کارڈز) کے استعمال کی بنیاد پر متن میں ذیلی اسٹرنگ کو تلاش کرنے اور ان کو جوڑنے کے لیے ایک رسمی زبان ہیں۔ سیدھے الفاظ میں، یہ حروف اور میٹا کریکٹرز کا ایک نمونہ ہے جو تلاش کے اصول کی وضاحت کرتا ہے۔ مثال کے طور پر: \D- ایک ٹیمپلیٹ جو کسی بھی غیر ڈیجیٹل کردار کو بیان کرتا ہے؛ \d- کسی بھی عددی کردار کی وضاحت کرتا ہے، جسے اس طرح بھی بیان کیا جا سکتا ہے [0-9]؛ [a-zA-Z]- ایک ٹیمپلیٹ جو لاطینی حروف کو a سے z تک بیان کرتا ہے، کیس غیر حساس؛ replaceAllکلاس کے طریقہ کار میں درخواست پر غور کریں String:
String value = "In JavaRush, Diego the best, Diego is Java God".replaceAll("\\s[a-zA-Z]{5}\\s", " Amigo ");
System.out.println(value);
کنسول آؤٹ پٹ:
In JavaRush, Amigo the best, Amigo is Java God
\\s[a-zA-Z]{5}\\s- خالی جگہوں سے گھرا ہوا 5 لاطینی حروف کا ایک لفظ بیان کرتا ہے۔ اس کے مطابق، اس ٹیمپلیٹ کو اس سٹرنگ سے بدل دیا گیا ہے جو ہم نے پاس کیا تھا۔

جاوا ریجیکس کو تبدیل کریں۔

بنیادی طور پر، جاوا میں ریگولر ایکسپریشنز کو استعمال کرنے کے لیے، کی صلاحیتیں java.util.regex۔ کلیدی کلاسیں ہیں:
  1. Pattern- ایک کلاس جو ریگولر ایکسپریشن کا مرتب شدہ ورژن فراہم کرتی ہے۔
  2. Matcher- یہ کلاس پیٹرن کی ترجمانی کرتی ہے اور اسے ملنے والی سٹرنگ میں میچوں کا تعین کرتی ہے۔
عام طور پر، یہ دونوں کلاسیں مل کر کام کرتی ہیں۔ تو، ہماری پچھلی چیز کیسی نظر آئے گی، لیکن اس کی مدد سے Matcherاور Pattern:
Pattern pattern = Pattern.compile("\\s[a-zA-Z]{5}\\s");
Matcher matcher = pattern.matcher("In JavaRush, Diego the best, Diego is Java God");
String value = matcher.replaceAll(" Amigo ");
System.out.println(value);
اور ہمارا نتیجہ ایک ہی ہو گا:
In JavaRush, Amigo the best, Amigo is Java God
آپ اس مضمون میں ریگولر ایکسپریشنز کے بارے میں مزید پڑھ سکتے ہیں ۔

تمام کو تبدیل کرنے کا متبادل

اس میں کوئی شک نہیں کہ طریقے بہت متاثر کن replaceہیں String، لیکن اس حقیقت کو نظر انداز نہیں کیا جا سکتا کہ Stringیہ immutableایک شے ہے، یعنی اس کی تخلیق کے بعد اسے تبدیل نہیں کیا جا سکتا۔ لہذا، جب ہم طریقوں کا استعمال کرتے ہوئے سٹرنگ کے کچھ حصوں کو تبدیل کرتے ہیں replace، تو ہم آبجیکٹ کو تبدیل نہیں کرتے ہیں String، بلکہ ضروری مواد کے ساتھ ہر بار ایک نیا بناتے ہیں۔ لیکن ہر بار ایک نئی چیز بنانے میں کافی وقت لگتا ہے، ہے نا؟ خاص طور پر جب سوال ایک دو اشیاء کا نہیں، بلکہ سینکڑوں یا اس سے بھی ہزاروں کا ہے۔ ولی نیلی، آپ متبادل کے بارے میں سوچنا شروع کر دیتے ہیں۔ اور ہمارے پاس کیا متبادل ہیں؟ جاوا میں سٹرنگ کو تبدیل کریں - 2ہمم... جب Stringاس کی خاصیت کی بات آتی ہے immutable، تو آپ فوری طور پر متبادل کے بارے میں سوچتے ہیں، لیکن نہیں immutable، یعنی StringBuilder/StringBuffer ۔ جیسا کہ ہمیں یاد ہے، یہ کلاسز درحقیقت مختلف نہیں ہیں، سوائے اس کے کہ StringBufferوہ کثیر تھریڈ والے ماحول میں استعمال کے لیے موزوں ہیں، اس لیے StringBuilderوہ سنگل تھریڈڈ استعمال میں کچھ تیزی سے کام کرتے ہیں۔ اس کی بنیاد پر، آج ہم استعمال کریں گے StringBuilder. اس کلاس کے بہت سے دلچسپ طریقے ہیں، لیکن خاص طور پر اب ہم اس میں دلچسپی رکھتے ہیں replace۔ StringBuilder replace(int start, int end, String str)- یہ طریقہ اس ترتیب کے ذیلی سٹرنگ میں حروف کو مخصوص سٹرنگ کے حروف سے بدل دیتا ہے۔ ذیلی اسٹرنگ مخصوص آغاز سے شروع ہوتی ہے اور انڈیکس کے آخر میں کردار تک جاری رہتی ہے، -1یا تسلسل کے اختتام تک اگر ایسا کوئی کردار موجود نہ ہو۔ آئیے ایک مثال دیکھتے ہیں:
StringBuilder strBuilder = new StringBuilder("Java Rush");
strBuilder.replace(5, 9, "God");
System.out.println(strBuilder);
نتیجہ:
Java God
جیسا کہ آپ دیکھ سکتے ہیں، ہم اس وقفہ کی نشاندہی کرتے ہیں جس میں ہم سٹرنگ لکھنا چاہتے ہیں، اور جو وقفہ میں ہے اس کے اوپر ایک ذیلی سٹرنگ لکھتے ہیں۔ لہذا، مدد کا استعمال کرتے ہوئے، StringBuilderہم طریقہ کا ایک اینالاگ دوبارہ بنائیں گے replaceall java. یہ کیسا نظر آئے گا:
public static String customReplaceAll(String str, String oldStr, String newStr) {

   if ("".equals(str) || "".equals(oldStr) || oldStr.equals(newStr)) {
       return str;
   }
   if (newStr == null) {
       newStr = "";
   }
   final int strLength = str.length();
   final int oldStrLength = oldStr.length();
   StringBuilder builder = new StringBuilder(str);

   for (int i = 0; i < strLength; i++) {
       int index = builder.indexOf(oldStr, i);

       if (index == -1) {
           if (i == 0) {
               return str;
           }
           return builder.toString();
       }
       builder = builder.replace(index, index + oldStrLength, newStr);

   }
       return builder.toString();
}
یہ پہلی نظر میں خوفناک ہے، لیکن تھوڑی سی سمجھ سے آپ سمجھ سکتے ہیں کہ ہر چیز اتنی پیچیدہ اور کافی منطقی نہیں ہے۔ ہمارے پاس تین دلائل ہیں:
  • str— ایک لائن جس میں ہم کچھ ذیلی تاروں کو تبدیل کرنا چاہتے ہیں۔
  • oldStr- ذیلی اسٹرنگز کی نمائندگی جسے ہم تبدیل کریں گے۔
  • newStr- ہم اسے کس چیز سے بدلیں گے۔
ifآنے والے ڈیٹا کو چیک کرنے کے لیے ہمیں پہلے کی ضرورت ہے، اور اگر سٹرنگ strیا تو oldStrخالی ہے، یا نئی ذیلی اسٹرنگ newStrپرانی کے برابر ہے oldStr، تو طریقہ کار پر عمل کرنا بے معنی ہوگا۔ لہذا، ہم اصل سٹرنگ واپس کرتے ہیں - str۔ اگلا، ہم چیک کرتے newStrہیں null، اور اگر یہ معاملہ ہے، تو ہم اسے ایک خالی سٹرنگ فارمیٹ میں تبدیل کرتے ہیں جو ہمارے لیے زیادہ آسان ہے ""۔ پھر ہمارے پاس متغیرات کا اعلان ہے جس کی ہمیں ضرورت ہے:
  • کل تار کی لمبائی str؛
  • سبسٹرنگ کی oldStrلمبائی
  • StringBuilderمشترکہ سٹرنگ سے آبجیکٹ ۔
ہم ایک لوپ شروع کرتے ہیں جو کل سٹرنگ کی لمبائی کے برابر کئی بار چلنا چاہیے (لیکن، غالباً، ایسا کبھی نہیں ہوگا)۔ کلاس کے طریقہ کار کا استعمال کرتے ہوئے StringBuilder- indexOf- ہم سب اسٹرنگ کی پہلی موجودگی کا اشاریہ تلاش کرتے ہیں جس میں ہماری دلچسپی ہے۔ بدقسمتی سے، میں یہ نوٹ کرنا چاہوں گا کہ یہ indexOfریگولر ایکسپریشنز کے ساتھ کام نہیں کرتا، اس لیے ہمارا حتمی طریقہ صرف تاروں کی موجودگی کے ساتھ ہی کام کرے گا (اگر یہ انڈیکس برابر ہے -1، تو موجودہ آبجیکٹ میں ان واقعات کے مزید واقعات نہیں ہیں StringBuilder، لہذا ہم دلچسپی کے نتیجے کے ساتھ طریقہ سے باہر نکلتے ہیں: یہ ہمارے میں موجود ہے StringBuilder، جسے ہم Stringاستعمال کرتے ہوئے تبدیل کرتے ہیں toString۔ اگر ہمارا انڈیکس -1لوپ کے پہلے تکرار میں برابر ہے، تو جس ذیلی اسٹرنگ کو تبدیل کرنے کی ضرورت ہے وہ عام طور پر نہیں تھی۔ اس لیے، ایسی صورت حال میں، ہم صرف عام سٹرنگ واپس کرتے ہیں۔ اگلا ہمارے پاس ہے اور اوپر بیان کیا گیا طریقہ استعمال کیا جاتا ہے replaceتاکہ StringBuilderوقوع کے پائے جانے والے انڈیکس کو استعمال کیا جا سکے تاکہ بدلے جانے والے ذیلی سٹرنگ کے نقاط کی نشاندہی کی جا سکے۔ یہ لوپ چلے گا۔ جتنی بار سب اسٹرنگز کو تبدیل کرنے کی ضرورت ہوتی ہے، اگر سٹرنگ صرف اس کردار پر مشتمل ہے جسے تبدیل کرنے کی ضرورت ہے، تو صرف اس صورت میں ہمارے پاس لوپ مکمل طور پر چلے گا اور نتیجہ StringBuilderسٹرنگ میں تبدیل ہو جائے گا۔ ہمیں اس طریقہ کی درستگی کو جانچنے کی ضرورت ہے، ٹھیک ہے؟ آئیے ایک ٹیسٹ لکھتے ہیں جو مختلف حالات میں طریقہ کار کے عمل کو چیک کرتا ہے:
@Test
public void customReplaceAllTest() {
   String str = "qwertyuiop__qwertyuiop__";

   String firstCase = Solution.customReplaceAll(str, "q", "a");
   String firstResult = "awertyuiop__awertyuiop__";
   assertEquals(firstCase, firstResult);

   String secondCase = Solution.customReplaceAll(str, "q", "ab");
   String secondResult = "abwertyuiop__abwertyuiop__";
   assertEquals(secondCase, secondResult);

   String thirdCase = Solution.customReplaceAll(str, "rtyu", "*");
   String thirdResult = "qwe*iop__qwe*iop__";
   assertEquals(thirdCase, thirdResult);

   String fourthCase = Solution.customReplaceAll(str, "q", "");
   String fourthResult = "wertyuiop__wertyuiop__";
   assertEquals(fourthCase, fourthResult);

   String fifthCase = Solution.customReplaceAll(str, "uio", "");
   String fifthResult = "qwertyp__qwertyp__";
   assertEquals(fifthCase, fifthResult);

   String sixthCase = Solution.customReplaceAll(str, "", "***");
   assertEquals(sixthCase, str);

   String seventhCase = Solution.customReplaceAll("", "q", "***");
   assertEquals(seventhCase, "");
}
7 الگ الگ ٹیسٹوں میں تقسیم کیا جا سکتا ہے، جن میں سے ہر ایک اپنے ٹیسٹ کیس کے لیے ذمہ دار ہو گا۔ اسے لانچ کرنے کے بعد، ہم دیکھیں گے کہ یہ سبز ہے، یعنی کامیاب ہے۔ ٹھیک ہے، یہ سب کچھ لگتا ہے. replaceAllاگرچہ انتظار کریں، ہم نے اوپر کہا کہ یہ طریقہ اس سے کہیں زیادہ تیز ہوگا String۔ ٹھیک ہے، آئیے ایک نظر ڈالیں:
String str = "qwertyuiop__qwertyuiop__";
long firstStartTime = System.nanoTime();

for (long i = 0; i < 10000000L; i++) {
   str.replaceAll("tyu", "#");
}

double firstPerformance = System.nanoTime() - firstStartTime;

long secondStartTime = System.nanoTime();

for (long i = 0; i < 10000000L; i++) {
   customReplaceAll(str, "tyu", "#");
}

double secondPerformance = System.nanoTime() - secondStartTime;

System.out.println("Performance ratio  - " +  firstPerformance / secondPerformance);
اگلا، یہ کوڈ تین بار چلایا گیا اور ہمیں درج ذیل نتائج ملے: کنسول آؤٹ پٹ:
Performance ratio  - 5.012148941181627
 
Performance ratio  - 5.320637176017641
 
Performance ratio  - 4.719192686500394
جیسا کہ ہم دیکھ سکتے ہیں، اوسطاً ہمارا طریقہ کلاسک replaceAllکلاس سے String5 گنا زیادہ نتیجہ خیز ہے! ٹھیک ہے، آخر میں، ایک ہی چیک چلائیں، لیکن، تو بات کرنے کے لئے، بیکار میں. دوسرے الفاظ میں، اس صورت میں جب کوئی مماثلت نہیں ملتی ہے۔ آئیے سرچ سٹرنگ کو سے میں تبدیل کرتے "tyu"ہیں "--"۔ تین رنز سے درج ذیل نتائج برآمد ہوئے: کنسول آؤٹ پٹ:
Performance ratio  - 8.789647093542246
 
Performance ratio  - 9.177105482660881
 
Performance ratio  - 8.520964375227406
اوسطاً، ایسے معاملات کی کارکردگی جہاں کوئی میچ نہیں پایا گیا 8.8 گنا اضافہ ہوا! جاوا میں سٹرنگ کو تبدیل کریں - 4
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION