پروگرامر جي ڪم ۾، گهڻو ڪري ڪجهه ڪم يا انهن جا حصا بار بار ٿي سگهن ٿا. تنهن ڪري، اڄ آئون هڪ موضوع تي رابطو ڪرڻ چاهيان ٿو جيڪو اڪثر ڪري ڪنهن به جاوا ڊولپر جي روزاني ڪم ۾ اچي ٿو. اچو ته فرض ڪريو ته توهان هڪ خاص طريقي سان هڪ خاص اسٽرنگ حاصل ڪيو. ۽ ان جي باري ۾ سڀ ڪجهه سٺو لڳي ٿو، پر اتي ڪجهه ٿوري شيء آهي جيڪا توهان کي مناسب ناهي. مثال طور، جدا ڪندڙ مناسب نه آهي، ۽ توهان کي ڪنهن ٻئي جي ضرورت آهي (يا بلڪل نه). اهڙي صورتحال ۾ ڇا ٿو ڪري سگهجي؟
replace
قدرتي طور، ڪلاس جا طريقا استعمال ڪريو String
.
جاوا اسٽرنگ تبديل ڪريو
قسم جي اعتراض کيString
متبادل طريقي جي چار تبديليون آھن replace
:
replace(char, char);
replace(CharSequence, CharSequence);
replaceFirst(String, String);
replaceAll(String, String).
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)
سب اسٽرنگ جي سڀني واقعن کي تبديل ڪري ٿو . هڪ باقاعده اظهار پهريون دليل طور استعمال ڪري سگهجي ٿو . مثال طور، اچو ته نالن سان اڳوڻي متبادل ڪرڻ جي ڪوشش ڪريو، پر نئين طريقي سان: regex
replacement
regex
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
. اھم ڪلاس آھن:
Pattern
- ھڪڙو طبقو جيڪو باقاعده اظهار جو مرتب ڪيل ورزن مهيا ڪري ٿو.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
، پر هر دفعي هڪ نئون ٺاهيندا آهيون، ضروري مواد سان. پر هر وقت نئين شئي ٺاهڻ ۾ هڪ ڊگهو وقت وٺندو آهي، ڇا اهو ناهي؟ خاص طور تي جڏهن سوال ٻن شين جو نه آهي، پر ٻه سئو، يا اڃا به هزارين. ولي-نلي، توهان متبادل جي باري ۾ سوچڻ شروع ڪيو. ۽ اسان وٽ ڪهڙا متبادل آهن؟ Hmm... جڏهن اهو اچي ٿو 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 ڀيرا وڌي ويو!
GO TO FULL VERSION