CodeGym /Java блог /Случаен /Подниз в Java
John Squirrels
Ниво
San Francisco

Подниз в Java

Публикувано в групата
Най-популярните действия върху String в Java са конкатенация, получаване на знак по индекс и получаване на подниз. В тази статия ще ви разкажем за метода на Java substring.

Какво е Java Substring?

Поднизът на Java като цяло е непрекъсната последователност от знаци вътре в низа. Може да бъде част от низа or целия низ. Подниз в Java - 2Какво е подниз в Java? Този език има метод substring() or по-скоро два метода, благодарение на претоварването на методите на Java. Можете да ги използвате, за да получите подниз в Java програма. Първият метод на Java substring е String substring(firstIndex), а вторият е String substring (firstIndex, lastIndex) .

Как да използвате подниз в Java

Отговорът е прост: просто използвайте подниза. Методът Java substring() връща част от низа. Има два метода, които можете да използвате за това:
Синтаксис на метода подниз Подниз от низ (firstIndex) Подниз от низ (firstIndex, lastIndex)
Аргументи firstIndex е число във вашия низ, което е първият индекс на вашия подниз. Включително. Последното число на вашия подниз е последното число на целия низ firstIndex е число във вашия низ, което е първият индекс на вашия подниз. Включително.
lastIndex е номерът на вашия низ, първият и всички след него са изключени от вашия подниз
Примери за използване на подниз в Java

String s = "CodeGym";
System.out.println(s.substring(4));
//returns Gym

String s = "CodeGym"; 
System.out.println(s.substring(2,5));
//returns deG
Много популярни задачи, които ви помагат да разберете
  • Как да получите подниз в Java
  • Как да намерите всички поднизове на даден низ
  • Как да намерим най-дългия общ подниз

Как да получите подниз в Java (по-специално)

Този първи пример за подниз в Java е доста лесен. Имате низ и трябва да намерите подниз „CodeGym“ в него. Вече знаете How да получите подниз в Java. И така, ето решението на този конкретен проблем:

import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       String s1 = "the best Java Core course is CourseCodeGym.  End of story";
       String myTarget = "CodeGym";
       int index1 = s1.indexOf(myTarget);
      
       int index2 = index1 + myTarget.length();
       System.out.println(s1.substring(index1, index2));

   }
}
Резултатът е: Процесът на CodeGym завърши с изходен code 0 Как да намерим всички поднизове на даден низ Тук имаме най-простия начин да намерим всички поднизове на даден низ.

import java.io.IOException;
public class Main {
   public static void main(String[] args) throws IOException {
       String myTarget = "CodeGym";
       for (int i = 0; i < myTarget.length(); i++) {
           for (int j = i + 1; j <= myTarget.length(); j++) {
               System.out.println(myTarget.substring(i, j));
           }
       }    
   }
}
Резултатът е: C Co Cod Code CodeG CodeGy CodeGym o od ode odeG odeGy odeGym d de deG deGy deGym e eG eGy eGym G Gy Gym y ym m Процесът завърши с изходен code 0 Как да намерим най-дългия общ подниз Проблем с най-дългия общ подниз е една от най-популярните задачи в компютърните науки. Можете да го срещнете на вашето интервю за Junior Developer с доста голяма вероятност. Както и да е, опитайте се да го решите, това е много полезно упражнение за начинаещ програмист. Проблемът с най-дългия общ подниз означава да се намери най-дългият низ (or няколко от тях), който е подниз (or са поднизове) от два or повече низа. Например имате два низа

String first = "CodeGym" 
String second = "SomeGym"
Изходът трябва да бъде: eGym И така, трябва да въведете низове "first" и "second". Отпечатайте най-дългия общ подниз. Ако два or повече подниза имат еднаква стойност за най-дългия общ подниз, отпечатайте всеки от тях. Силно ви препоръчваме да опитате да разрешите този проблем сами и едва след това да погледнете codeа по-долу.

public class SubStringTest {

   //  in this method we are looking for the Longest common substring of
   // first String with length = m  and the second String with length = n
   public static String longestCS(String first, String second, int m, int n) {
       // the maximal length
       int maxLength = 0;
       // the last index of the longest common substring
       int endIndex = m;

       // array stores the length of substring
       int[][] keeper = new int[m + 1][n + 1];

       for (int i = 1; i <= m; i++) {
           for (int j = 1; j <= n; j++) {
               // check if current characters of first and second strings match
               if (first.charAt(i - 1) == second.charAt(j - 1)) {
                   keeper[i][j] = keeper[i - 1][j - 1] + 1;
                  
                   if (keeper[i][j] > maxLength) {
                       maxLength = keeper[i][j];
                       endIndex = i;
                   }
               }
           }
       }
       return first.substring(endIndex - maxLength, endIndex);
   }


   public static void main(String[] args) {
       String first = "CodeGym";
       String second = "SomeGym";
       int m = first.length(), n = second.length();
       System.out.println("The longest common substring = " + longestCS(first, second, m, n));
   }
}
Резултатът е: Най-дългият общ подниз = eGym

Как работи поднизът в Java

В JDK 7 и по-нови версии, substring() вече не брои броя знаци в масива от знаци, който създава, Howто беше във версии преди JDK 6 включително, а просто създава нов масив в паметта (купчина) и препраща към него . Ето един пример:

String x = "CodeGymIsTheBest";
String y = x.substring (2,6);
String z = x.substring (0,3);
И така, в JDK 7 и по-нови, обекти y и z , създадени в резултат на метода substring() , приложен към обект x , ще се отнасят до два новосъздадени масива (в купчината) - {d,e, G, y} за y и {C, o} за z . Във version JDK 7 + на подниза на метода тези два нови реда (т.е. два нови масива от знаци) ще бъдат съхранени в паметта заедно с оригиналния низ myLongString ({ C, o, d, e, G, y, m, i, s, t, h, e, b,e,s,t} под формата на масив) .

JDK 6 version на подниз

Дори днес при някои големи проекти може да срещнете наследена codeова база от JDK 6 пъти. В JDK 6 методът substring() работи по различен начин. Както вероятно знаете, String е неизменен клас и за да получи подниза, Java използва тази неизменност по-рано в JDK 6. Обектът от тип String вътре е просто масив от знаци or по-скоро съдържа масив от знаци. По времето на JDK 6 там се съхраняваха още две променливи: номерът на първия знак в масива от знаци и тяхното количество. По този начин, в JDK 6, String имаше три полета на char стойност [] (символен масив), int отместване (индекс на първия знак в масива) и int count(броят знаци в масива). Когато се създава подниз в JDK 6, масивът от знаци не се копира в новия обект String . Вместо това и двата обекта съхраняват препратка към един и същ масив от символи. Вторият обект обаче съхранява още две променливи, първият символ на подниза, а вторият е за това колко символа има в подниза. Методът JDK 6 беше заменен поради проблем с изтичане на памет. Какво означава? Да приемем, че имаме низ xи създаваме няколко подниза с помощта на подниз.

String x = "CodeGymIsTheBest";
String y = x.substring (2,6);
String z = x.substring (0,3);
Сега имаме обект x , съхранен в специална област на паметта, наречена купчина, и два обекта y и z , отнасящи се до един и същ обект x . Само x се отнася за елементите от втори до шести, а z се отнася за x елементи от нула до трета. Ами ако оригиналният обект x вече е бил използван и е оставен без ниHowви препратки към него? В програмата всички други обекти работят само с y и z . В този случай събирачът на отпадъци може да унищожи обекта x, докато масивът от памет остава и се използва от y и z. Изтичането на памет се случва. Така че по-новият, JDK 7 и по-нова version, метод е доста скъп по отношение на използването на паметта. Въпреки това ви позволява да предотвратите изтичане на памет. Освен това новият метод работи по-бързо, тъй като не трябва да изчислява броя на знаците. За да затвърдите наученото, ви предлагаме да гледате видео урок от нашия курс по Java
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION