JavaRush /Java Blog /Random-TK /Java-da setiri çalyşyň

Java-da setiri çalyşyň

Toparda çap edildi
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. Java-da setiri çalyşyň - 1Belli 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? replaceElbetde, 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).
Bu usullaryň hemmesiniň maksady birmeňzeş - setiriň bir bölegini başga setir bilen çalyşmak. Geliň, olara has içgin seredeliň. 1.replace(char, char) String replace(char oldChar, char newChar) - birinji argumentiň häsiýetiniň ähli hadysalaryny oldCharikinjisi 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: regexreplacementregex
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 replaceAllsynp 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çilikleri java.util.regex. Esasy synplar:
  1. Pattern- yzygiderli aňlatmagyň jemlenen görnüşini üpjün edýän synp.
  2. Matcher- bu synp nagşy düşündirýär we alýan setirindäki gabat gelýänleri kesgitleýär.
Adatça bu iki synp bilelikde işleýär. Şeýlelik bilen, öňki obýektimiz nähili bolar, ýöne kömegi Matcherbilen 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

replaceUsullaryň 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ň: StringimmutablereplaceStringJava-da setiri çalyşyň - 2StringimmutableimmutableStringBufferStringBuilderStringBuilder.replaceStringBuilder 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, StringBuilderusulyň 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.
Gelýän maglumatlary barlamak üçin birinjisi ifgerek , eger setir boş strbolsa oldStrýa-da täze substring newStrköne bilen deň bolsa oldStr, usuly ýerine ýetirmek manysyz bolar. Şonuň üçin asyl setiri gaýtaryp berýäris - str. newStrOndan 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;
  • StringBuilderumumy setirden obýekt .
Jemi setiriň uzynlygyna birnäçe gezek işlemeli aýlawy başlaýarys (ýöne, beýle bolmaz). Synp usulyny ulanyp 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. toStringEger indeksimiz -1aý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. replaceAllGaraş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 replaceAllsynpdan String5 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! Java-da setiri çalyşyň - 4
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION