Zrozumienie podciągów w Javie: podstawowy przewodnik

W tym artykule pomożemy Ci zrozumieć podciągi w Javie. Podamy nie tylko teoretyczne wyjaśnienie, ale także rzeczywiste przykłady kodu, które pomogą Ci w wizualizacji. Nauczymy Cię, jak tworzyć podciągi i pomożemy znaleźć podciągi w ciągu.

Ale zanim się ich nauczymy, musimy mieć podstawy dotyczące podłańcuchów.

Co to są łańcuchy i podciągi?

W kontekście języka Java łańcuch reprezentuje sekwencję znaków. Każdy napis w Javie jest obiektem. Ciąg znaków w Javie może zawierać znaki, symbole, a nawet spacje. Z drugiej strony podłańcuch w Javie jest częścią lub podzbiorem ciągu Javy.

Na przykład „Geek” jest podłańcuchem ciągu „newsblog.pl”. Podciągi pomagają uzyskać określoną część ciągu.

Jeśli masz imię „John Doe” i chcesz mieć tylko imię „John”, możesz je łatwo uzyskać za pomocą podciągów. Co więcej, biorąc pod uwagę, że masz listę nazwisk „John, Jack, Jolly” i chcesz dowiedzieć się, czy znajduje się na niej „John”, możesz to również zrobić za pomocą podciągów. To tylko przykłady. Możemy używać podłańcuchów w różnych operacjach, gdy je zrozumiemy.

Ponieważ jesteśmy już świadomi koncepcji podciągów w Javie, dowiedzmy się teraz, jak tworzyć i pracować z podciągami w Javie.

# 1. Za pomocą metody „substring()”.

Metoda „substring()” pozwala nam bardzo łatwo tworzyć podciągi. Pobiera do dwóch parametrów jako dane wejściowe – startIndex lub oba startIndex i endIndex i zwraca nam żądany podłańcuch.

W zależności od ilości parametrów możemy go wykorzystać na dwa sposoby. A teraz poznajmy je szczegółowo.

podłańcuch (int startIndex)

Na początek możemy użyć metody w postaci „substring(startIndex)”. Tutaj ta metoda przyjmuje wartość całkowitą jako dane wejściowe, gdzie dane wejściowe są pozycją początkową podciągu. Zwraca ciąg, zaczynając od podanego indeksu początkowego, aż do końca oryginalnego ciągu.

Jako przykład spójrzmy na następujący kod:

public class Substrings{    
    public static void main(String args[]){    
    String str="newsblog.pl";    
    System.out.println("Given String: " + str);  
    System.out.println("Substring: " +str.substring(4)); //index of strings start from 0
    }  
   }

WYJŚCIE:

Given String: newsblog.pl
Substring: Flare

Z danych wyjściowych widzimy, że ciąg wejściowy to „newsblog.pl”, a zwracana wartość to podciąg „Flare”. Tworzy podłańcuch z podanego indeksu (4), czyli od pozycji 5 do końca łańcucha.

substring(int startIndex, int endIndex)

Jest to kolejny sposób użycia metody substring klasy String. Do metody substring możemy przekazać dwie liczby całkowite. Indeks początkowy i indeks końcowy. Aby tego użyć, musimy użyć metody w formacie „substring(startIndex,endIndex)”.

Aby lepiej to zrozumieć, spójrzmy na przykładowy kod:

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareFans";    
    System.out.println("Given String: " + str);  
    System.out.println("Substring: " +str.substring(4,9));  //You get a substring starting from index no. 4 to index 8.

    }  
   }

WYJŚCIE:

Given String: GeekFlareFans
Substring: Flare

Jak widzimy, biorąc pod uwagę ciąg „GeekFlareFans”, wyprowadza podciąg „Flare”. Podaliśmy indeks początkowy 4 i indeks końcowy 9. Zaczyna się od elementu o indeksie 4 i kończy się przed 9. Należy zauważyć, że nie drukuje elementu z indeksem końcowym. Daje nam podciąg, który zawiera wszystkie elementy do indeksu końcowego, ale wyklucza element z indeksem końcowym.

#2. Za pomocą metody „split()”.

„split()” to kolejna metoda klasy String w Javie, która pomaga nam tworzyć podłańcuch. Jest to przydatne, gdy wiele informacji jest przechowywanych w jednym łańcuchu ze wspólnym znakiem separatora.

W składni pojawia się termin „regex”, który może wydawać się nieco onieśmielający, więc zanim przejdziemy dalej, zrozummy, czym jest regex. Regex to skrót od „wyrażeń regularnych”. Wyrażenie regularne to sekwencja znaków opisująca wzorzec wewnątrz ciągu znaków lub tekstu. W kontekście metody split naszym separatorem jest wyrażenie regularne.

Metoda „split()” może przyjąć do dwóch zmiennych jako dane wejściowe, są to ciąg znaków regularnych i graniczna liczba całkowita. Wyrażenie regularne jest separatorem, którego znalezienie powoduje podzielenie oryginalnego ciągu znaków na 2 części — część przed wyrażeniem regularnym i część po wyrażeniu regularnym.

Załóżmy na przykład, że próbujesz podzielić ciąg „abcdef” na „bcd” jako wyrażenie regularne. W rezultacie otrzymalibyśmy podciągi „a” i „ef”.

Metoda zwraca tablicę z rozdzielonymi łańcuchami. Możemy określić tylko wyrażenie regularne lub zarówno wyrażenie regularne, jak i limit. Poznajmy po kolei różne sposoby wywoływania tej metody.

split(ciąg znaków regularnych)

Pierwsza metoda otrzymuje tylko ciąg wyrażenia regularnego w formacie „split(regex)”. Nie ma zmiennej limitu; dlatego zwraca wszystkie oddzielone podciągi w tablicy.

Uzyskajmy jasne zrozumienie za pomocą kodu:

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare";
    String[] substrings=str.split("%");
    System.out.println("Given String: " + str);
    System.out.println("First Substring: " + substrings[0]);
    System.out.println("Second Substring: " + substrings[1]);
     
    }  
}

WYJŚCIE:

Given String: Geek%Flare
First Substring: Geek
Second Substring: Flare

Jak widzimy z kodu, podany string ma separator regex „%”. Nie musi to być pojedynczy znak, może to być dowolny ciąg o dowolnej liczbie znaków. Metoda „split()” ignoruje to wyrażenie regularne i podaje nam wszystkie łańcuchy, które zostały oddzielone tym wyrażeniem regularnym. Podciągi są przechowywane w tablicy.

W kodzie podany ciąg to „Geek%Flare”. Otrzymujemy więc tablicę zawierającą dwa elementy, którymi są „Geek” i „Flare”. Później uzyskaliśmy do nich dostęp z ich odpowiednimi indeksami, które wynoszą odpowiednio 0,1, i wydrukowaliśmy „Geek” i „Flare” na konsoli.

W tym miejscu należy również zauważyć, że jeśli do metody nie zostaną przekazane żadne parametry, po prostu zgłosi ona błąd. Ale jeśli podamy pusty ciąg („”) jako wyrażenie regularne, otrzymamy każdy pojedynczy znak jako podciąg. Spójrzmy na przykład do wizualizacji.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare";
    String[] substrings=str.split("");
    System.out.println(Arrays.toString(substrings));
     
    }  
}

WYJŚCIE:

[G, e, e, k, %, F, l, a, r, e]

Z przykładu widać, że parametr regex jest pustym łańcuchem, zwraca wszystkie znaki jako oddzielne podłańcuchy, co można wyraźnie zobaczyć, wyświetlając tablicę wyjściową metody „split()”.

split (ciąg znaków regularnych, limit int)

Dzięki drugiemu wariantowi tej metody uzyskujemy większą kontrolę nad danymi wyjściowymi i możemy dodatkowo dostroić dane wyjściowe metody „split()”. Tutaj metoda „split()” pobiera dwie zmienne jako dane wejściowe. W tym przypadku wraz z wyrażeniem regularnym podajemy również parametr limitu w określonym formacie „split(regex, limit)”.

„Limit” to liczba ciągów wynikowych, które są wyprowadzane. W zależności od wartości limitu mogą istnieć trzy możliwości:

Przypadek 1: Jeśli limit>0, wynikowa tablica zawierałaby dane wyjściowe, ale zastosowałaby co najwyżej podział (limit-1). Tutaj wynikowa tablica nie zawierałaby więcej elementów niż określony limit, a cały pozostały łańcuch, który nie został podzielony, byłby przechowywany bez zmian. Ułatwmy to zrozumienie za pomocą kodu.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%the%best";
    String[] substrings=str.split("%",2);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

WYJŚCIE:

[Geek, Flare%is%the%best]

Zobacz na wyjściu, że w tablicy wyników są tylko dwa elementy, które są liczbą podaną w parametrze limit. Zauważ też, że podział jest stosowany tylko raz, czyli (limit-1) razy.

Jeśli jednak wyrażenie regularne występuje dwa razy z rzędu („%%”), będzie zawierało puste podciągi. Spójrz na ten fragment kodu, aby lepiej go zrozumieć.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",5);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

WYJŚCIE:

[Geek, Flare, is, , the%best%%%]

Zasadniczo, jeśli po „%” następuje kolejny „%” lub koniec łańcucha, przekształca się on w pusty podciąg.

Przypadek 2: Jeśli limit <0, akcja podziału zostałaby zastosowana tyle razy, ile to możliwe, bez ograniczenia rozmiaru tablicy, ale tablica zawierałaby puste podłańcuchy, jeśli wyrażenie regularne występuje dwa razy z rzędu („%%”).

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",-1);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

WYJŚCIE:

[Geek, Flare, is, , the, best, , , ]

Z danych wyjściowych widać, że podział jest stosowany tyle razy, ile to możliwe, a także występują puste podłańcuchy.

Przypadek 3: Jeśli limit=0, akcja podziału zostałaby zastosowana tyle razy, ile to możliwe, ale tutaj wszystkie puste podciągi na końcu łańcucha zostałyby odrzucone z tablicy.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",0);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

WYJŚCIE:

[Geek, Flare, is, , the, best]

Widzimy, że dane wyjściowe są dość podobne między wartościami limit=-1 i limit=0, ale nie ma końcowych pustych podłańcuchów. Innymi słowy, puste podciągi na końcu tablicy podciągów są ignorowane.

Należy również zauważyć, że jeśli wyrażenie regularne nie występuje w łańcuchu, jako wynik zwraca cały oryginalny ciąg.

Znajdź, czy ciąg zawiera podciąg

Oprócz tworzenia podłańcuchów z istniejących łańcuchów, możemy również określić podłańcuch i dowiedzieć się, czy ten podłańcuch istnieje w łańcuchu. Jest to szybki i łatwy sposób na zapytanie o podłańcuch, co jest przydatne w wielu przypadkach użycia. Ale jak to zrobić? Różne metody mogą nam w tym pomóc. Przejrzyjmy je jeden po drugim.

Używając metody „zawiera()”:

Możemy bardzo łatwo znaleźć istnienie podłańcucha za pomocą metody „contains()”. Ta metoda klasy String pobiera jako dane wejściowe ciąg, który jest naszym podłańcuchem, i zwraca wartość logiczną sprawdzającą, czy podłańcuch znajduje się w ciągu, czy nie. Ta metoda może być używana wewnątrz bloków if-else, operatorów jednoargumentowych i różnych innych miejsc do implementacji złożonej logiki.

Poznajmy bliżej tę metodę.

public class Substrings{    
    public static void main(String args[]){    
    String str="newsblog.pl";    
    System.out.println("Does it contain Flare? \n"+ str.contains("Flare"));  
    }  
}

WYJŚCIE:

Does it contain Flare? 
true

Kod sprawdza ciąg „newsblog.pl” pod kątem słowa „Flare”, a po pomyślnym znalezieniu zwraca wartość logiczną „true”, potwierdzając w ten sposób istnienie podciągu.

public class Substrings{    
    public static void main(String args[]){    
    String str="newsblog.pl";    
    System.out.println("Does it contain Flare? \n"+ str.contains("Flare1"));  
    }  
}

WYJŚCIE:

Does it contain Flare? 
false

Z przykładu rozumiemy, że jeśli podciąg nie znajduje się w ciągu, metoda zwróci wartość false, aby zaznaczyć, że nie istnieje. Możemy więc łatwo upewnić się, czy podłańcuch istnieje.

Znajdowanie pozycji podciągu

# 1. Używając „indexOf()”:

Metoda „indexOf()” może być użyta do znalezienia podłańcucha, jak również do znalezienia jego indeksu. Metoda przyjmuje jako dane wejściowe ciąg znaków lub znak i podaje nam pozycję jego pierwszego wystąpienia. Ale jest w stanie podać nam tylko indeks pierwszego wystąpienia i nie może potwierdzić, czy istnieją inne wystąpienia tego. Inną rzeczą, na którą należy zwrócić uwagę, jeśli podłańcuch nie istnieje, metoda zwraca -1.

Przyjrzyjmy się więc bliżej tej metodzie.

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareGeekFlare";    
    System.out.println("Index of Flare: "+ str.indexOf("Flare"));  
    }  
}

WYJŚCIE:

Index of Flare: 4

W tym przykładzie pierwsze wystąpienie podciągu „Flare” zaczyna się od indeksu 4 w ciągu „GeekFlareGeekFlare”. Tak więc, zgodnie z oczekiwaniami, funkcja zwróciła indeks.

#2. Używając „lastIndexOf()”:

’lastIndexOf()’ jest bardzo podobny do 'indexOf()’. Obie te metody przyjmują jako dane wejściowe podłańcuch i zwracają indeks jego pozycji. Ma nawet tę samą wartość zwracaną, gdy nie może znaleźć podłańcucha w określonym ciągu. Obie te metody zwracają -1 w przypadku nieudanego znalezienia.

Ale podczas gdy „indexOf()” zwraca indeks pierwszego wystąpienia podłańcucha, „lastIndexOf()” zwraca ostatnie wystąpienie.

Zobaczmy to w akcji za pomocą kodu:

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareGeekFlare";    
    System.out.println("Last index of Flare: "+ str.lastIndexOf("Flare"));  
    }  
}

WYJŚCIE:

Last index of Flare:13

Obserwując ten wynik, rozumiemy, że metoda 'lastIndexOf()’ zachowuje się zgodnie z oczekiwaniami i otrzymujemy indeks ostatniego wystąpienia podłańcucha „Flare” w ciągu „GeekFlareGeekFlare”.

Często zadawane pytania

Jak używać metody „split ()” do tworzenia niepustych podciągów?

Jeśli istnieje wiele wystąpień wyrażenia regularnego w łańcuchu głównym, jedno po drugim („Hello%%Hi”, gdzie wyrażenie regularne to „%”), metoda „split()” traktuje pierwsze wystąpienie jako znak przerwania, a pozostałe zwracają pusty ciąg. Aby to złagodzić, możemy określić parametr limitu jako 0. W związku z tym jako dane wyjściowe zostaną wyświetlone tylko niepuste łańcuchy.

Czy „indexOf()” zwraca indeksy wszystkich wystąpień podłańcucha?

Nie, „indexOf()” nie zwraca indeksów wszystkich wystąpień podłańcucha. Z 'indexOf()’ otrzymujemy całkowitą wartość zwracaną zawierającą indeks pierwszego wystąpienia podłańcucha. Ale jeśli nie może znaleźć podłańcucha, metoda zwróci -1.

Co zwraca metoda „substring()”, jeśli podane indeksy nie istnieją w łańcuchu?

Jeśli podany indeks początkowy i indeks końcowy nie istnieją w łańcuchu, kompilator zgłosi błąd. Błąd powinien zawierać „java.lang.StringIndexOutOfBoundsException: ” i po prostu nie zostanie wykonany.

Wniosek

W tym artykule omówiliśmy różne metody i podstawy, aby rozpocząć pracę z podciągami. Omówiliśmy tworzenie podłańcucha i sprawdzanie istnienia podłańcucha w ciągu. Pozwoli ci to lepiej zrozumieć, jak pracować z podciągami. Postępuj zgodnie z przykładami i ćwicz więcej, aby uzyskać dokładne zrozumienie podciągów.

Następnie możesz sprawdzić naszą listę pytań do rozmowy kwalifikacyjnej Java.