I denna artikel kommer vi att utforska hur man hanterar delsträngar i Java. Vi kommer inte bara att ge en teoretisk bakgrund utan även ge konkreta kodexempel för att illustrera hur det fungerar. Vi kommer att gå igenom hur man skapar delsträngar och hur man söker efter delsträngar inuti en given sträng.
Innan vi dyker djupare in i ämnet är det viktigt att förstå grunderna i vad strängar och delsträngar egentligen är.
Strängar och Delsträngar – Grunderna
I Java utgör en sträng en sekvens av tecken. Varje sträng i Java är faktiskt ett objekt. En sträng kan innehålla bokstäver, siffror, symboler och till och med blanksteg. En delsträng, å andra sidan, är en del eller en undermängd av en sträng.
Till exempel är ”Geek” en delsträng av ”adminvista.com”. Delsträngar gör det möjligt att isolera en viss del av en sträng.
Tänk dig att du har namnet ”John Doe” och du bara vill ha förnamnet ”John”. Med delsträngar kan du enkelt extrahera just det. Om du har en lista med namn som ”John, Jack, Jolly” och vill undersöka om namnet ”John” finns med, kan du även då använda dig av delsträngar. Dessa exempel illustrerar användbarheten med delsträngar. Det finns många olika situationer där vi kan använda delsträngar när vi väl förstår hur de fungerar.
Nu när vi har en grundläggande förståelse för delsträngar, låt oss nu se hur vi kan skapa och använda dem i Java.
#1. Användning av metoden ’substring()’
Metoden ’substring()’ gör det enkelt att skapa delsträngar. Den tar en eller två parametrar som indata – antingen startIndex, eller både startIndex och endIndex – och returnerar den önskade delsträngen.
Beroende på antalet parametrar kan metoden användas på två sätt. Låt oss undersöka dem mer i detalj.
substring(int startIndex)
För det första kan metoden användas i formatet ’substring(startIndex)’. Denna metod tar ett heltal som indata, där detta heltal representerar startpositionen för delsträngen. Den returnerar sedan en sträng som börjar från det angivna startindexet fram till slutet av den ursprungliga strängen.
Låt oss titta på ett kodexempel:
public class Substrings{ public static void main(String args[]){ String str="adminvista.com"; System.out.println("Given String: " + str); System.out.println("Substring: " +str.substring(4)); //Index för strängar börjar från 0 } }
UTMATNING:
Given String: adminvista.com Substring: vista.com
Som vi ser i utmatningen är den givna strängen ”adminvista.com”, och returvärdet är delsträngen ”vista.com”. Delsträngen skapas från det angivna indexet (4), det vill säga från position 5 fram till slutet av strängen.
substring(int startIndex, int endIndex)
Ett annat sätt att använda metoden substring är att tillhandahålla två heltal, ett startindex och ett slutindex. För att göra detta måste metoden anropas i formatet ’substring(startIndex,endIndex)’.
Låt oss undersöka några kodexempel för att ytterligare illustrera detta:
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)); //En delsträng erhålls från index 4 till index 8. } }
UTMATNING:
Given String: GeekFlareFans Substring: Flare
Som vi ser, med den givna strängen ”GeekFlareFans”, ger metoden oss delsträngen ”Flare”. Vi angav startindex 4 och slutindex 9. Delsträngen börjar vid elementet med index 4 och slutar innan index 9. Det är viktigt att notera att elementet med slutindexet inte inkluderas i delsträngen. Delsträngen kommer alltså att inkludera alla element fram till, men inte inklusive, det sista indexet.
#2. Användning av metoden ’split()’
’split()’ är en annan metod i klassen String i Java som hjälper oss att skapa delsträngar. Denna metod är användbar när flera delar av information lagras i en sträng, separerade av ett gemensamt avgränsningstecken.
Syntaxen nämner termen ”regex” som kan verka skrämmande, så låt oss först förstå vad regex är innan vi går vidare. Regex är en förkortning av ”Regular Expressions” (reguljära uttryck). Ett regex är en sekvens av tecken som beskriver ett mönster inom en sträng eller text. I samband med metoden split är regex alltså vårt avgränsningstecken.
Metoden ’split()’ kan ta emot upp till två variabler som indata; en regex-sträng och ett heltal för limit. Regex är alltså avgränsningstecknet. När det tecknet hittas, resulterar det i att den ursprungliga strängen delas upp i två delar – delen före regex och delen efter regex.
Om vi t.ex. försöker dela strängen ”abcdef” med ”bcd” som regex, skulle resultatet bli delsträngarna ”a” och ”ef”.
Metoden returnerar en array med de separerade strängarna. Vi kan antingen ange enbart regex eller både regex och en limit. Låt oss titta på olika sätt att anropa metoden ett i taget.
split(String regex)
Den första metoden tar bara regex-strängen i formatet ’split(regex)’. Den har ingen begränsningsvariabel; alltså kommer alla separerade delsträngar att returneras i en array.
Låt oss titta på ett kodexempel för att förstå hur den fungerar:
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]); } }
UTMATNING:
Given String: Geek%Flare First Substring: Geek Second Substring: Flare
Som vi kan se i koden har den givna strängen avgränsningstecknet ”%”. Det behöver inte vara ett enskilt tecken; det kan vara vilken sträng som helst med valfritt antal tecken. Metoden ’split()’ ignorerar detta regex och ger oss alla strängar som separerades av detta regex. Delsträngarna lagras i en array.
I koden är den givna strängen ”Geek%Flare”. Så vi får en array med två element, ”Geek” och ”Flare”. Vi kommer sedan åt dem via deras respektive index, som är 0 och 1, och skriver ut ”Geek” och ”Flare” i konsolen.
Här bör vi också notera att om inga parametrar skickas till metoden, kommer den helt enkelt att returnera ett fel. Men om vi ger en tom sträng (””) som regex, får vi varje enskilt tecken som en delsträng. Låt oss titta på ett exempel för att visualisera detta.
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)); } }
UTMATNING:
[G, e, e, k, %, F, l, a, r, e]
Från exemplet är det tydligt att eftersom regex-parametern är en tom sträng, returneras alla tecken som separata delsträngar. Vi kan tydligt se detta genom att skriva ut utdatamatrisen från metoden ’split()’.
split(String regex,int limit)
Med den andra varianten av den här metoden får vi mer kontroll över utdatan och kan finjustera resultatet av metoden ’split()’ ytterligare. I detta fall tar metoden ’split()’ två variabler som indata. Tillsammans med regex ger vi nu även en begränsningsparameter, enligt formatet ’split(regex, limit)’.
’Limit’ är antalet resulterande strängar som returneras. Beroende på gränsvärdet finns det tre olika möjligheter:
Fall 1: Om limit > 0, kommer den resulterande arrayen att innehålla utdata, men den kommer att tillämpa splittringen som mest (limit-1) gånger. Arrayen kommer alltså inte att innehålla fler element än det angivna limit, och all överbliven sträng som inte har delats kommer att lagras som den var. Låt oss förstå detta lättare genom ett kodexempel.
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)); } }
UTMATNING:
[Geek, Flare%is%the%best]
Som utmatningen visar, finns det bara två element i den resulterande arrayen, vilket är det antal som anges i limitparametern. Observera också att splittringen endast tillämpas en gång, alltså (limit-1) gånger.
Om regex däremot finns där två gånger i rad (”%%”), skulle det resultera i tomma delsträngar. Titta på den här koden för att förstå detta bättre.
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)); } }
UTMATNING:
[Geek, Flare, is, , the%best%%%]
I princip, om ”%” följs av ett annat ”%” eller slutet av strängen, omvandlas det till en tom delsträng.
Fall 2: Om limit < 0, kommer delningsoperationen att tillämpas så många gånger som möjligt utan att det finns någon gräns för arrayens storlek, men arrayen kommer att innehålla tomma delsträngar om regex finns där två gånger i rad (”%%”).
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)); } }
UTMATNING:
[Geek, Flare, is, , the, best, , , ]
Från utmatningen är det uppenbart att splittringen tillämpas så många gånger som möjligt, och tomma delsträngar inkluderas också.
Fall 3: Om limit=0, kommer splittringsoperationen också att tillämpas så många gånger som möjligt, men i detta fall kommer alla tomma delsträngar i slutet av strängen att ignoreras från arrayen.
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)); } }
UTMATNING:
[Geek, Flare, is, , the, best]
Vi kan se att utmatningen är ganska lik när limit=-1 och limit=0, men det finns inga efterföljande tomma delsträngar. De tomma delsträngarna i slutet av delsträngsarrayen ignoreras helt enkelt.
Observera också att om regex inte finns i strängen, returneras hela den ursprungliga strängen som resultat.
Kontrollera om en sträng innehåller en delsträng
Förutom att skapa delsträngar från befintliga strängar, kan vi också ange en delsträng och ta reda på om delsträngen finns inuti en sträng. Detta är ett snabbt och enkelt sätt att undersöka om en delsträng finns, och det är användbart i många situationer. Men hur gör vi det? Det finns flera metoder som kan hjälpa oss med detta. Låt oss gå igenom dem en efter en.
Användning av metoden ’contains()’
Vi kan enkelt hitta förekomsten av en delsträng med hjälp av metoden ’contains()’. Denna metod i klassen String tar en sträng som indata, som i sin tur är vår delsträng, och returnerar ett booleskt värde som anger om delsträngen finns inuti strängen eller inte. Metoden kan användas i if-else-block, unära operatorer och på andra ställen för att implementera komplex logik.
Låt oss lära känna denna metod lite närmare.
public class Substrings{ public static void main(String args[]){ String str="adminvista.com"; System.out.println("Does it contain vista? \n"+ str.contains("vista")); } }
UTMATNING:
Does it contain vista? true
Koden kontrollerar strängen ”adminvista.com” för ordet ”vista”, och när ordet hittas returneras det booleska värdet ”true”, vilket bekräftar att delsträngen finns.
public class Substrings{ public static void main(String args[]){ String str="adminvista.com"; System.out.println("Does it contain Flare? \n"+ str.contains("Flare")); } }
UTMATNING:
Does it contain Flare? false
Från exemplet förstår vi att om delsträngen inte finns i strängen, kommer metoden att returnera false för att indikera att den inte hittas. På så vis kan vi enkelt verifiera om en delsträng finns eller inte.
Hitta positionen för en delsträng
#1. Användning av ’indexOf()’
Metoden ’indexOf()’ kan användas för att hitta förekomsten av en delsträng och även hitta dess index. Metoden tar en sträng eller ett tecken som indata och ger oss positionen för den första förekomsten. Men metoden kan endast ge oss index för den första förekomsten och kan inte bekräfta om andra förekomster finns. En annan sak att notera är att om delsträngen inte finns, returnerar metoden -1.
Låt oss utforska metoden lite närmare.
public class Substrings{ public static void main(String args[]){ String str="GeekFlareGeekFlare"; System.out.println("Index of Flare: "+ str.indexOf("Flare")); } }
UTMATNING:
Index of Flare: 4
I det här exemplet börjar den första förekomsten av delsträngen ”Flare” från index 4 i strängen ”GeekFlareGeekFlare”. Som förväntat returnerar funktionen alltså det korrekta indexet.
#2. Användning av ’lastIndexOf()’
’lastIndexOf()’ liknar metoden ’indexOf()’. Båda dessa metoder tar en delsträng som indata och returnerar indexet för dess position. Båda metoderna returnerar också -1 om de inte hittar delsträngen i den angivna strängen.
Medan ’indexOf()’ returnerar index för den första förekomsten av delsträngen, returnerar ’lastIndexOf()’ däremot den sista förekomsten.
Låt oss se hur det fungerar i praktiken med ett kodexempel:
public class Substrings{ public static void main(String args[]){ String str="GeekFlareGeekFlare"; System.out.println("Last index of Flare: "+ str.lastIndexOf("Flare")); } }
UTMATNING:
Last index of Flare: 13
Genom att granska utdatan inser vi att metoden ’lastIndexOf()’ fungerar som förväntat. Vi får alltså index för den senaste förekomsten av delsträngen ”Flare” i strängen ”GeekFlareGeekFlare”.
Vanliga Frågor
Hur använder man metoden ’split()’ för att skapa icke-tomma delsträngar?
Om det finns flera regex-instanser av regex-strängen i huvudsträngen efter varandra (”Hello%%Hi”, där regex är ”%”), kommer metoden ’split()’ att betrakta den första instansen som ett brytningstecken, och resten kommer att generera tomma strängar som utdata. För att undvika detta, kan vi ange limit-parametern till 0. Detta kommer att generera endast icke-tomma strängar som utdata.
Returnerar ’indexOf()’ index för alla instanser av en delsträng?
Nej, ’indexOf()’ returnerar inte index för alla instanser av en delsträng. Med ’indexOf()’ får vi ett heltal som anger index för den första förekomsten av delsträngen. Men om den inte kan hitta delsträngen, kommer metoden att returnera -1.
Vad returnerar metoden ’substring()’ om de angivna indexen inte finns i strängen?
Om de angivna start- och slutindexen inte finns i strängen, kommer kompilatorn att ge ett felmeddelande. Felet kommer att vara ”java.lang.StringIndexOutOfBoundsException:” och programmet kommer inte att kunna köras.
Slutsats
I den här artikeln har vi gått igenom olika metoder och grundläggande koncept för att komma igång med delsträngar. Vi har diskuterat hur man skapar delsträngar och hur man kontrollerar förekomsten av delsträngar i en sträng. Detta kommer att ge dig en bättre förståelse för hur man arbetar med delsträngar. Följ exemplen och öva mer för att få en grundlig förståelse för delsträngar.
Du kan också kolla in vår lista med Java-intervjufrågor.