JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ اسٽرنگ کي تبديل ڪريو

جاوا ۾ اسٽرنگ کي تبديل ڪريو

گروپ ۾ شايع ٿيل
پروگرامر جي ڪم ۾، گهڻو ڪري ڪجهه ڪم يا انهن جا حصا بار بار ٿي سگهن ٿا. تنهن ڪري، اڄ آئون هڪ موضوع تي رابطو ڪرڻ چاهيان ٿو جيڪو اڪثر ڪري ڪنهن به جاوا ڊولپر جي روزاني ڪم ۾ اچي ٿو. جاوا ۾ اسٽرنگ کي تبديل ڪريو - 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، پر هر دفعي هڪ نئون ٺاهيندا آهيون، ضروري مواد سان. پر هر وقت نئين شئي ٺاهڻ ۾ هڪ ڊگهو وقت وٺندو آهي، ڇا اهو ناهي؟ خاص طور تي جڏهن سوال ٻن شين جو نه آهي، پر ٻه سئو، يا اڃا به هزارين. ولي-نلي، توهان متبادل جي باري ۾ سوچڻ شروع ڪيو. ۽ اسان وٽ ڪهڙا متبادل آهن؟ جاوا ۾ اسٽرنگ کي تبديل ڪريو - 2Hmm... جڏهن اهو اچي ٿو 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- هڪ لڪير جنهن ۾ اسان کي تبديل ڪرڻ چاهيو ٿا ڪجهه substrings؛
  • 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
جئين اسان ڏسي سگهون ٿا، سراسري طور تي اسان جو طريقو 5 ڀيرا وڌيڪ پيداوار آهي کلاسک replaceAllطبقي کان! Stringخير، آخرڪار، اچو ته ساڳي چيڪ کي هلون، پر، ڳالهائڻ لاء، بيڪار. ٻين لفظن ۾، ان صورت ۾ جڏهن ڪو ميلاپ نه مليو. اچو ته ڳولا واري اسٽرنگ کي "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