Pochopení podřetězců v Javě: Základní průvodce

V tomto článku vám pomůžeme porozumět podřetězcům v Javě. Poskytneme vám nejen teoretické vysvětlení, ale také skutečné příklady kódu, které vám pomohou s vizualizací. Naučíme vás vytvářet podřetězce a pomůžeme vám najít podřetězce uvnitř řetězce.

Než se je ale naučíme, musíme mít základy podřetězců.

Co jsou řetězce a podřetězce?

V kontextu Javy představuje řetězec posloupnost znaků. Každý řetězec v Javě je objekt. Řetězec v Javě může obsahovat znaky, symboly a dokonce i mezery. Na druhou stranu podřetězec v Javě je částí nebo podmnožinou řetězce Java.

Například „Geek“ je podřetězec „etechblog.cz“. Podřetězce vám pomohou získat konkrétní část řetězce.

Pokud máte jméno „John Doe“ a chcete pouze křestní jméno „John“, můžete ho snadno získat pomocí podřetězců. Navíc, vzhledem k tomu, že máte seznam jmen „John, Jack, Jolly“ a chcete zjistit, zda je v něm „John“, můžete to udělat také s podřetězci. Toto jsou pouze pouhé příklady. Jakmile jim porozumíme, můžeme použít podřetězce v různých operacích.

Protože jsme si nyní vědomi konceptu podřetězců v Javě, pojďme se nyní seznámit s tím, jak vytvářet a pracovat s podřetězci v Javě.

#1. Pomocí metody ‚substring()‘

Metoda ‚substring()‘ nám umožňuje velmi snadno vytvářet podřetězce. Jako vstup bere až dva parametry – startIndex nebo oba startIndex a endIndex a vrátí nám podřetězec, který chceme.

V závislosti na počtu parametrů jej můžeme využít dvěma způsoby. Pojďme se o nich nyní podrobněji seznámit.

podřetězec (int startIndex)

Pro začátek můžeme použít metodu ve tvaru ‚substring(startIndex)‘. Zde tato metoda bere jako vstup celočíselnou hodnotu, kde vstupem je počáteční pozice podřetězce. Vrací řetězec začínající od poskytnutého počátečního indexu do konce původního řetězce.

Jako příklad se podívejme na následující kód:

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

VÝSTUP:

Given String: etechblog.cz
Substring: Flare

Z výstupu vidíme, že vstupní řetězec je „etechblog.cz“ a návratová hodnota je podřetězec „Flare“. Vytvoří podřetězec z daného indexu (4), tedy od pozice 5 do konce řetězce.

podřetězec (int startIndex, int endIndex)

Toto je další způsob použití metody podřetězec třídy String. Metodě podřetězců můžeme předat dvě celá čísla. Počáteční index a koncový index. Abychom to mohli použít, musíme použít metodu ve formátu ‚substring(startIndex,endIndex)‘.

Abychom tomu porozuměli dále, podívejme se na několik příkladů kódu:

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.

    }  
   }

VÝSTUP:

Given String: GeekFlareFans
Substring: Flare

Jak můžeme vidět, vzhledem k řetězci „GeekFlareFans“ je výstupem podřetězec „Flare“. Počáteční index jsme dali 4 a koncový index 9. Začíná od prvku s indexem 4 a končí před 9. Musíme si uvědomit, že netiskne prvek s koncovým indexem. Poskytuje nám podřetězec, který zahrnuje všechny prvky až do koncového indexu, ale vylučuje prvek s koncovým indexem.

  Vytvářejte GIFy z videí a přidávejte text pomocí nového Imgur GIF Creator

#2. Pomocí metody ‚split()‘

‚split()‘ je další metoda třídy String v Javě, která nám pomáhá vytvořit podřetězec. To je užitečné, když je v jednom řetězci uloženo více informací se společným oddělovacím znakem.

Syntaxe zmiňuje termín „regulární výraz“, který se vám může zdát trochu zastrašující, takže než budeme pokračovat, pojďme si vysvětlit, co je regulární výraz. Regex je zkratka pro „regulární výrazy“. Regulární výraz je posloupnost znaků, která popisuje vzor uvnitř řetězce nebo textu. V kontextu metody rozdělení je regulární výraz naším oddělovačem.

Metoda ‚split()‘ může mít jako vstup až dvě proměnné, jsou to řetězec regulárního výrazu a limitní celé číslo. Regulární výraz je oddělovač, který po nalezení vede k rozdělení původního řetězce na 2 části – část před regulárním výrazem a část za regulárním výrazem.

Předpokládejme například, že se pokoušíte rozdělit řetězec „abcdef“ na „bcd“ jako regulární výraz. Jako výsledek bychom dostali podřetězce „a“ a „ef“.

Metoda vrací pole s oddělenými řetězci. Můžeme buď zadat pouze regulární výraz, nebo regulární výraz i limit. Pojďme se seznámit s několika způsoby volání této metody jeden po druhém.

rozdělení (regulární výraz řetězce)

První metoda přijímá pouze řetězec regulárního výrazu ve formátu ‚split(regex)‘. Nemá limitní proměnnou; proto vrátí všechny oddělené podřetězce v poli.

Pojďme si jasně porozumět s nějakým kódem:

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]);
     
    }  
}

VÝSTUP:

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

Jak vidíme z kódu, daný řetězec má oddělovací regulární výraz „%“. Nemusí to být jeden znak, může to být libovolný řetězec s libovolným počtem znaků. Metoda ‚split()‘ tento regulární výraz ignoruje a poskytuje nám všechny řetězce, které byly tímto regulárním výrazem odděleny. Podřetězce jsou uloženy uvnitř pole.

V kódu je daný řetězec „Geek%Flare“. Dostaneme tedy pole se dvěma prvky, kterými jsou „Geek“ a „Flare“. Později jsme k nim přistoupili s jejich příslušnými indexy, které jsou 0,1, a vytiskli jsme na konzoli „Geek“ a „Flare“.

Zde bychom také měli poznamenat, že pokud metodě nejsou předány žádné parametry, jednoduše vyvolá chybu. Ale pokud zadáme prázdný řetězec (“”) jako regulární výraz, dostaneme každý jednotlivý znak jako podřetězec. Podívejme se na příklad pro vizualizaci.

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));
     
    }  
}

VÝSTUP:

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

Z příkladu je zřejmé, že parametr regulárního výrazu je prázdný řetězec, vrací všechny znaky jako samostatné podřetězce a jasně to můžeme vidět vytištěním výstupního pole metody ‚split()‘.

split (regulární výraz řetězce, limit int)

S druhou variantou této metody získáme větší kontrolu nad výstupem a můžeme dále doladit výstup metody ‚split()‘. Zde metoda ‚split()‘ bere jako vstup dvě proměnné. V tomto případě spolu s regulárním výrazem uvedeme také limitní parametr ve specifikovaném formátu ‚split(regex, limit)‘.

  Jak obnovíte svůj starý účet Xbox One

‚Limit‘ je počet výsledných řetězců, které jsou na výstupu. V závislosti na hodnotě limitu mohou být tři možnosti:

Případ 1: Pokud je limit>0, výsledné pole by obsahovalo výstup, ale nanejvýš by aplikovalo rozdělení (limit-1). Zde by výsledné pole neobsahovalo více prvků, než je zadaný limit, a veškerý zbývající řetězec, který není rozdělen, by byl uložen tak, jak byl. Pojďme si to usnadnit pochopení nějakým kódem.

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));
     
    }  
}

VÝSTUP:

[Geek, Flare%is%the%best]

Ve výstupu se podívejte, jak jsou v poli výsledků pouze dva prvky, což je číslo uvedené v parametru limit. Všimněte si také, že rozdělení se použije pouze jednou, takže (limit-1) krát.

Pokud je však regulární výraz uveden dvakrát za sebou („%%“), bude mít prázdné podřetězce. Podívejte se na tento kousek kódu, abyste mu lépe porozuměli.

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));
     
    }  
}

VÝSTUP:

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

V zásadě, pokud za „%“ následuje další „%“ nebo konec řetězce, transformuje se na prázdný podřetězec.

Případ 2: Pokud je limit<0, akce rozdělení by se použila tolikrát, kolikrát je to možné, bez omezení velikosti pole, ale pole by obsahovalo prázdné podřetězce, pokud by tam byl regulární výraz dvakrát za sebou („%%“).

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));
     
    }  
}

VÝSTUP:

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

Z výstupu je patrné, že rozdělení je aplikováno tolikrát, kolikrát je to možné, a také jsou přítomny prázdné podřetězce.

Případ 3: Pokud je limit=0, akce rozdělení by se také použila tolikrát, kolikrát je to možné, ale zde by byly všechny prázdné podřetězce na konci řetězce z pole vyřazeny.

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));
     
    }  
}

VÝSTUP:

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

Vidíme, že výstup je docela podobný mezi když limit=-1 a když limit=0, ale neexistují žádné koncové prázdné podřetězce. Jinými slovy, prázdné podřetězce na konci pole podřetězců jsou ignorovány.

Všimněte si také, že pokud regulární výraz v řetězci není, vrátí jako výsledek celý původní řetězec.

Zjistěte, zda řetězec obsahuje podřetězec

Kromě vytváření podřetězců z existujících řetězců můžeme také určit podřetězec a zjistit, zda tento podřetězec uvnitř řetězce existuje. Jedná se o rychlý a snadný způsob dotazu na podřetězec a to je užitečné v mnoha případech použití. Ale jak to uděláme? K tomu nám mohou pomoci různé metody. Pojďme si je projít jeden po druhém.

Použití metody ‚contains()‘:

Existenci podřetězce můžeme velmi snadno zjistit pomocí metody ‚contains()‘. Tato metoda třídy String bere jako vstup řetězec, což je náš podřetězec, a vrací booleovskou hodnotu, která kontroluje, zda je podřetězec uvnitř řetězce nebo ne. Tuto metodu lze použít uvnitř bloků if-else, unárních operátorů a různých dalších míst k implementaci složité logiky.

  Jak opravit závažnou chybu zjištěnou PNP: Příčiny, opravy a prevence

Pojďme se s touto metodou seznámit trochu více.

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

VÝSTUP:

Does it contain Flare? 
true

Kód zkontroluje řetězec „etechblog.cz“ pro slovo „Flare“ a po jeho úspěšném nalezení vrátí booleovskou hodnotu „true“, čímž potvrdí existenci podřetězce.

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

VÝSTUP:

Does it contain Flare? 
false

Z příkladu jsme pochopili, že pokud podřetězec není uvnitř řetězce, metoda vrátí false, což znamená jeho neexistenci. Můžeme si tedy být snadno jisti, zda podřetězec existuje.

Nalezení pozice podřetězce

#1. Použití ‚indexOf()‘:

Metodu ‚indexOf()‘ lze použít k nalezení existence podřetězce a také k nalezení jeho indexu. Metoda bere jako vstup řetězec nebo znak a dává nám pozici jeho prvního výskytu. Ale je schopen nám poskytnout pouze index prvního výskytu a nemůže potvrdit, zda existují další výskyty tohoto. Další věc, kterou je třeba poznamenat, pokud podřetězec neexistuje, metoda vrátí -1.

Pojďme si tedy tuto metodu trochu více prozkoumat.

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

VÝSTUP:

Index of Flare: 4

Zde v příkladu začíná první výskyt podřetězce „Flare“ od indexu 4 v řetězci „GeekFlareGeekFlare“. Takže, jak se očekávalo, funkce vrátila index.

#2. Použití ‚lastIndexOf()‘:

‚lastIndexOf()‘ je velmi podobný ‚indexOf()‘. Obě tyto metody berou jako vstup podřetězec a vracejí index jeho pozice. Dokonce má stejnou návratovou hodnotu, když nemůže najít podřetězec v zadaném řetězci. Obě tyto metody vrátí hodnotu -1 pro neúspěšné hledání.

Ale zatímco ‚indexOf()‘ vrací index prvního výskytu podřetězce, ‚lastIndexOf()‘ vrací poslední výskyt.

Podívejme se na to v akci prostřednictvím kódu:

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

VÝSTUP:

Last index of Flare:13

Pozorováním tohoto výstupu pochopíme, že metoda ‚lastIndexOf()‘ se chová podle očekávání a získáme index posledního výskytu podřetězce „Flare“ v řetězci „GeekFlareGeekFlare“.

Nejčastější dotazy

Jak použít metodu ‚split()‘ k vytvoření neprázdných podřetězců?

Pokud je v hlavním řetězci více instancí regulárního výrazu řetězce regulárního výrazu jedna po druhé („Ahoj%%Hi“, kde regulární výraz je „%“), metoda ‚split()‘ považuje první výskyt za znak přerušení a zbytek poskytuje výstup prázdného řetězce. Abychom to zmírnili, můžeme zadat parametr limit jako 0. Proto bude jako výstup poskytovat pouze neprázdné řetězce.

Vrací ‚indexOf()‘ indexy všech instancí podřetězce?

Ne, ‚indexOf()‘ nevrací indexy všech instancí podřetězce. Pomocí ‚indexOf()‘ získáme celočíselnou návratovou hodnotu obsahující index prvního výskytu podřetězce. Ale pokud nemůže najít podřetězec, metoda vrátí -1.

Co vrátí metoda ‚substring()‘, pokud dané indexy v řetězci neexistují?

Pokud daný počáteční a koncový index v řetězci neexistují, kompilátor vyvolá chybu. Chyba by měla mít „java.lang.StringIndexOutOfBoundsException: “ a jednoduše se neprovede.

Závěr

V tomto článku jsme probrali různé metody a náležitosti, jak začít s podřetězci. Diskutovali jsme o vytvoření podřetězce a kontrole existence podřetězce v řetězci. To vám umožní lépe pochopit, jak pracovat s podřetězci. Postupujte podle příkladů a více procvičujte, abyste důkladně porozuměli podřetězcům.

Dále se můžete podívat na náš seznam otázek na pohovor v jazyce Java.