Programmistiň işinde köplenç käbir meseleler ýa-da olaryň bölekleri gaýtalanyp bilner. Şonuň üçin bu gün islendik Java döredijiniň gündelik işinde köplenç duş gelýän mowzuga degmek isleýärin. Belli bir usuldan belli bir setir alýarsyňyz öýdýän. Bu hakda hemme zat gowy ýaly bolup görünýär, ýöne size laýyk gelmeýän kiçijik bir zat bar. Mysal üçin, bölüji laýyk däl we başga birine mätäç (ýa-da asla ýok). Şeýle ýagdaýda näme edip bolar?
replace
Elbetde, synpyň usullaryny ulanyň String
.
Java setiri çalyşmak
Görnüş obýektiniňString
çalyşmagyň usulynyň dört görnüşi bar replace
:
replace(char, char);
replace(CharSequence, CharSequence);
replaceFirst(String, String);
replaceAll(String, String).
replace(char, char)
String replace(char oldChar, char newChar)
- birinji argumentiň häsiýetiniň ähli hadysalaryny oldChar
ikinjisi bilen çalyşýar - newChar
. Bu mysalda, vergul belgisi bilen çalyşarys:
String value = "In JavaRush, Diego the best, Diego is Java God".replace(',', ';');
System.out.println(value);
Konsol çykyşy:
In JavaRush; Diego the best; Diego is Java God
2.replace(CharSequence, CharSequence)
Bellenen nyşanlaryň yzygiderliligine gabat gelýän setiriň her aşaky bölegini çalyşýan nyşanlaryň yzygiderliligi bilen çalyşýar.
String value = "In JavaRush, Diego the best, Diego is Java God".replace("Java", "Rush");
System.out.println(value);
Netije:
In RushRush, Diego the best, Diego is Rush God
3.replaceFirst(String, String)
String replaceFirst(String regex, String replacement)
- Görkezilen yzygiderli aňlatma gabat gelýän ilkinji substrini çalyşma setiri bilen çalyşýar. Nädogry yzygiderli aňlatma ulananyňyzda, “PatternSyntaxException” -y alyp bilersiňiz (bu gowy zat däl). Bu mysalda, çempion robotyň adyny çalyşalyň:
String value = "In JavaRush, Diego the best, Diego is Java God".replaceFirst("Diego", "Amigo");
System.out.println(value);
Konsol çykyşy:
In JavaRush, Amigo the best, Diego is Java God
Görşümiz ýaly, “Diego” -nyň diňe ilkinji ýazgysy üýtgedi, ýöne soňraky ýazgylar galmady, ýagny degilmedi. 4. replaceAll()
Java-da - String replaceAll(String regex, String replacement)
bu usul aşaky setiriň ähli hadysalaryny çalyşýar . Ilkinji argument hökmünde yzygiderli aňlatma ulanylyp bilner . Mysal hökmünde, öňki çalyşmagy atlar bilen ýerine ýetirmäge synanyşalyň, ýöne täze usul bilen: regex
replacement
regex
String value = "In JavaRush, Diego the best, Diego is Java God".replaceAll("Diego", "Amigo");
System.out.println(value);
Konsol çykyşy:
In JavaRush, Amigo the best, Amigo is Java God
Görşümiz ýaly, ähli nyşanlar zerur nyşanlar bilen doly çalşyryldy. Amigo göwnünden turar öýdýän =)
Yzygiderli aňlatmalar
Aboveokarda yzygiderli aňlatma ulanyp çalşyp boljakdygy aýdyldy. Ilki bilen, yzygiderli aňlatmagyň nämedigini özümize düşündireliň? Yzygiderli aňlatmalar , metacharacterleri (ýabany kartalary) ulanmaga esaslanýan tekstdäki substrleri gözlemek we dolandyrmak üçin resmi dil. Plyönekeý söz bilen aýdylanda, gözleg düzgünini kesgitleýän nyşanlaryň we metacharacterleriň nagşy. Mysal üçin:\D
- sanly däl nyşanlary suratlandyrýan şablon; \d
- islendik häsiýeti kesgitleýär, ony hem suratlandyryp bolar [0-9]
; [a-zA-Z]
- latyn harplaryny a-dan z-a çenli suratlandyrýan şablon; Programmany replaceAll
synp usulynda gözden geçiriň String
:
String value = "In JavaRush, Diego the best, Diego is Java God".replaceAll("\\s[a-zA-Z]{5}\\s", " Amigo ");
System.out.println(value);
Konsol çykyşy:
In JavaRush, Amigo the best, Amigo is Java God
\\s[a-zA-Z]{5}\\s
- boşluklar bilen gurşalan 5 latyn harpyndan ybarat bir sözi suratlandyrýar. Şoňa laýyklykda bu şablon geçen setirimiz bilen çalşyrylýar.
Java regex çalyşýar
Esasan, Java-da yzygiderli aňlatmalary ulanmak, mümkinçiliklerijava.util.regex
. Esasy synplar:
Pattern
- yzygiderli aňlatmagyň jemlenen görnüşini üpjün edýän synp.Matcher
- bu synp nagşy düşündirýär we alýan setirindäki gabat gelýänleri kesgitleýär.
Matcher
bilen 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);
Biziň netijämiz hem şeýle bolar:
In JavaRush, Amigo the best, Amigo is Java God
Bu makalada yzygiderli aňlatmalar hakda has köp okap bilersiňiz .
Hemmesini çalyşmak üçin alternatiw
replace
Usullaryň gaty täsir galdyryjydygyna şek ýok , ýöne onuň obýektdigini , ýagny döredilenden soň üýtgedip bolmajakdygyny String
äsgermezlik edip bolmaz . Şonuň üçin setiriň käbir böleklerini usullar bilen çalyşanymyzda , obýekti üýtgetmeýäris , her gezek zerur mazmun bilen täzesini döredýäris. Eachöne her gezek täze bir obýekt döretmek köp wagt alýar, şeýlemi? Esasanam sorag iki zat däl-de, bir-iki ýüz, hatda müňlerçe. Willy-nilly, alternatiwalar hakda pikirlenip başlaýarsyňyz. Bizde başga alternatiwalar barmy? Hmm ... Emlägi barada aýdylanda , derrew alternatiwalar hakda pikir edýärsiňiz, ýöne StringBuilder / StringBuffer däl . Classesadymyzda bolsa, bu sapaklar aslynda tapawutlanmaýar, köp sapakly gurşawda ulanmak üçin optimallaşdyrylanlaryndan başga, bir sapakly ulanylanda birneme çalt işleýär. Şundan ugur alyp, bu gün ulanarys Bu synpda köp gyzykly usul bar, ýöne indi indi gyzyklanýar . - bu usul bu yzygiderliligiň aşaky bölegindäki nyşanlary görkezilen setirdäki nyşanlar bilen çalyşýar. Substring görkezilen başlangyçdan başlaýar we indeksiň soňundaky nyşan ýa-da şeýle nyşan ýok bolsa yzygiderliligiň ahyryna çenli dowam edýär. Bir mysala seredeliň: String
immutable
replace
String
String
immutable
immutable
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);
Netije:
Java God
Görşüňiz ýaly, setir ýazmak isleýän aralygymyzy görkezýäris we aralykdaky zatlaryň üstünde aşaky ýazgy ýazýarys. Şeýlelik bilen, kömegi ulanyp, StringBuilder
usulyň meňzeşini dörederis replaceall java
. Bu nähili bolar:
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();
}
Bir seretseň gorkunç, ýöne azajyk düşünmek bilen hemme zadyň beýle çylşyrymly we gaty mantykly däldigine düşünip bilersiňiz. Bizde üç delil bar:
str
- käbir aşaky bölekleri çalyşmak isleýän setirimiz;oldStr
- çalyşjak substrleriň görnüşi;newStr
- onuň bilen çalyşjak zadymyz.
if
gerek , eger setir boş str
bolsa oldStr
ýa-da täze substring newStr
köne bilen deň bolsa oldStr
, usuly ýerine ýetirmek manysyz bolar. Şonuň üçin asyl setiri gaýtaryp berýäris - str
. newStr
Ondan soň barlaýarys null
, eger şeýle bolsa, ony has amatly formata öwürýäris - ""
. Soňra bize zerur üýtgeýänleriň beýany bar:
- umumy setir uzynlygy
str
; - aşaky uzynlygy
oldStr
; StringBuilder
umumy setirden obýekt .
StringBuilder
- indexOf
- özümizi gyzyklandyrýan substringiň ilkinji ýüze çykmagynyň görkezijisini tapýarys. Gynansagam, yzygiderli aňlatmalar bilen işlemeýändigini bellemek isleýärin indexOf
, şonuň üçin iň soňky usulymyz diňe setirleriň ýüze çykmagy bilen işlär ((Bu görkeziji deň bolsa -1
, häzirki obýektde beýle hadysalar bolmaz) StringBuilder
, Şeýlelik bilen, gyzyklanmanyň netijesi bilen usuldan çykýarys: bu, özümiziň içimizde bar StringBuilder
, ulanyp ulanýarys String
. toString
Eger indeksimiz -1
aýlawyň birinji gezek gaýtalanmagynda deň bolsa, onda çalşylmaly substring umuman däldi. Ilki bilen setir. Şonuň üçin şeýle ýagdaýda umumy setiri yzyna gaýtaryp berýäris. Indiki bizde we ýokarda beýan edilen usul, çalyşmagyň aşaky koordinatlaryny görkezmek üçin ýüze çykan görkezijini ulanmak replace
üçin ulanylýar. Bu aýlaw işlär. StringBuilder
çalyşmaly substrings näçe gezek tapylsa, setir diňe çalşylmaly nyşanlardan ybarat bolsa, diňe şu ýagdaýda bizde aýlaw doly işleýär we netijäni setire öwüreris StringBuilder
. Bu usulyň dogrulygyny barlamaly, şeýlemi? Dürli ýagdaýlarda usulyň işleýşini barlaýan synag ýazalyň:
@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 aýratyn synaga bölüp bolar, olaryň her biri öz synag işi üçin jogapkär bolar. Ony işe girizenimizden soň, onuň ýaşyl, ýagny üstünlikli bolandygyny göreris. Dogrusy, bularyň hemmesi ýaly. replaceAll
Garaşsa-da, ýokarda bu usulyň has çalt boljakdygyny aýtdyk String
. Geliň, göreli:
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);
Ondan soň bu kod üç gezek işledildi we aşakdaky netijeleri aldyk: Konsol çykyşy:
Performance ratio - 5.012148941181627
Performance ratio - 5.320637176017641
Performance ratio - 4.719192686500394
Görşümiz ýaly, ortaça usulymyz nusgawy replaceAll
synpdan String
5 esse has öndürijidir! Bolýar, ahyrsoňy, şol bir barlagy işledeliň, ýöne başgaça aýdanymyzda biderek. Başgaça aýdylanda, hiç hili gabat gelmedik ýagdaýynda. "tyu"
Gözleg setirini şu ýere geçireliň "--"
. Üç ylgaw aşakdaky netijeleri berdi: Konsol çykyşy:
Performance ratio - 8.789647093542246
Performance ratio - 9.177105482660881
Performance ratio - 8.520964375227406
Ortaça, hiç hili gabat gelmedik ýagdaýlar üçin öndürijilik 8,8 esse ýokarlandy!
GO TO FULL VERSION