En forelesningsbit med en mentor som en del av Codegym University-kurset. Meld deg på hele kurset.


"Hei, Amigo! I dag skal vi analysere noen flere vanlige scenarier som involverer arbeid med strenger. Vet du for eksempel hvordan du deler en streng i flere deler?"

"Jeg skal ikke fortelle deg det med en gang, Ellie. Men du kommer til å fortelle meg det, ikke sant?"

split()metode

"Det er flere måter å gjøre dette på. Den første måten å dele en streng i flere deler er å bruke metoden split(). Et regulært uttrykk som definerer en spesiell avgrensende streng må sendes som en parameter. Du vil lære hva et regulært uttrykk er i Java Collections- oppdraget.

Eksempel:

Kode Resultat
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Resultatet vil være en rekke av tre strenger:
["Good ", "ws everyo", "!"]

Enkelt, men noen ganger er denne tilnærmingen overdreven. Hvis det er mange skilletegn (for eksempel mellomrom, nylinjetegn, tabulatorer, punktum), må du konstruere et ganske komplekst regulært uttrykk."

"Vel, ja. Og hvis det er vanskelig å lese, så er det vanskelig å gjøre endringer.

StringTokenizerklasse

En forelesningsbit med en mentor som en del av Codegym University-kurset. Meld deg på hele kurset.


"Java har en spesiell klasse hvis hele jobben er å dele en streng i understrenger.

"Denne klassen bruker ikke regulære uttrykk: i stedet sender du bare inn en streng som består av skilletegn. Fordelen med denne tilnærmingen er at den ikke bryter hele strengen i stykker på en gang, men i stedet flyttes fra begynnelse til slutt. trinn om gangen.

Klassen har en konstruktør og to metoder. Vi sender konstruktøren en streng som vi deler i deler, og en streng som består av et sett med avgrensende tegn.

Metoder Beskrivelse
String nextToken()
Returnerer neste delstreng
boolean hasMoreTokens()
Sjekker om det er flere understrenger.

"Denne klassen minner meg på en eller annen måte om Scanner-klassen, som også har nextLine()og hashNextLine()metoder.

"Det er en god observasjon du har gjort. Du kan lage et StringTokenizerobjekt med denne kommandoen:

StringTokenizer name = new StringTokenizer(string, delimiters);

Hvor streng er strengen som skal deles opp i deler. Og skilletegn er en streng, og hvert tegn i den behandles som et skilletegn. Eksempel:

Kode Konsollutgang
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

"Merk at hvert tegn i strengen som sendes i den andre strengen til konstruktøren StringTokenizerregnes som en separator.

String.format()metode og StringFormatterklasse

"En annen interessant metode for String-klassen er format().

"La oss si at du har forskjellige variabler som lagrer data. Hvordan viser du dem på skjermen på én linje? For eksempel har vi noen data (venstre kolonne) og ønsket utgang (høyre kolonne):

Kode Konsollutgang
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Koden for et slikt program vil se omtrent slik ut:

Programkode
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

"Du er enig med meg i at koden ikke er særlig lesbar. Og hvis variabelnavnene var lengre, ville koden blitt enda vanskeligere:

Programkode
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

"Ja, det er vanskelig å lese!"

"Ikke bekymre deg. Dette er en vanlig situasjon i programmer i den virkelige verden, så jeg vil fortelle deg om en måte å skrive denne koden enklere og mer konsist på.

String.format

" StringKlassen har en statisk format()metode: den lar deg spesifisere et mønster for å sette sammen en streng med data. Det generelle utseendet til kommandoen er som følger:

String name = String.format(pattern, parameters);

Eksempel:

Kode Resultat
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

" format()Metodens første parameter er en formatstreng som inneholder all ønsket tekst sammen med spesialtegn som kalles formatspesifisatorer (som %dog %s) på stedene der du trenger å sette inn data.

" format()Metoden erstatter disse %sog %dformatspesifikatorene med parameterne som følger formatstrengen i parameterlisten. Hvis vi vil sette inn en streng, så skriver vi . %sHvis vi vil sette inn et tall, så er formatspesifikatoren %d. Eksempel:

Kode Resultat
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
ser lik"a=1, b=4, c=3"

"Her er en kort liste over formatspesifikasjoner som kan brukes i formatstrengen:

Spesifiser Betydning
%s
String
%d
interger: byte, short, int,long
%f
reelt tall: float,double
%b
boolean
%c
char
%t
Date
%%
%karakter

"Disse spesifikatorene indikerer typen data, men det er også spesifisatorer som indikerer rekkefølgen av dataene. For å få et argument ved nummeret (nummereringen starter fra én), må du skrive " % 1$ d " i stedet for " %d ". Eksempel:

Kode Resultat
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
ser lik"a=13, b=12, c=11"

%3$dvil få det 3. argumentet, %2$dvil få det andre argumentet, og %dvil få det aller første argumentet. Formatspesifikasjonene %sog %drefererer til argumenter uavhengig av spesifikasjoner som %3$deller%2$s

String Pool

"Hver streng spesifisert i kode som en strengliteral er lagret i et minneområde som kalles mens StringPoolprogrammet kjører. StringPooler en spesiell matrise for lagring av strenger. Formålet er å optimalisere strenglagring:

"For det første må strengene som er spesifisert i kode lagres et sted, ikke sant? Kode består av kommandoer, men data (spesielt store strenger) må lagres i minnet separat fra koden. Bare referanser til strengobjekter vises i kode.

"For det andre må alle identiske strengliteraler bare lagres i minnet én gang. Og det er bare slik det fungerer. Når klassekoden din lastes inn av Java-maskinen, blir alle strengliteraler lagt til hvis de ikke allerede er der. Hvis de StringPooler allerede der, så bruker vi ganske enkelt en strengreferanse fra StringPool.

Følgelig, hvis du tilordner samme literal til flere strengvariabler i koden din, vil disse variablene inneholde samme referanse. En bokstavelig vil bli lagt til den StringPooleneste ene. I alle andre tilfeller vil koden få en referanse til strengen som allerede er lastet inn i StringPool.

Slik fungerer det omtrent:

Kode Jobber med StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"Det er grunnen til at variablene aog bvil lagre de samme referansene."

«Jeg håper jeg har forstått det hele riktig.

intern()metode.

"Og det beste er at du kan programmere legge til hvilken som helst streng til StringPool. For å gjøre dette trenger du bare å kalle Stringvariabelens intern()metode.

" intern()Metoden vil legge til strengen til StringPoolhvis den ikke allerede er der, og vil returnere en referanse til strengen i StringPool.

"Og hva vil skje hvis to identiske strenger legges til ved å StringPoolbruke intern()metoden?"

"Metoden vil returnere de samme referansene. Denne kan brukes til å sammenligne strenger ved referanse. Eksempel:

Kode Merk
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Det er usannsynlig at du bruker denne metoden ofte. Når det er sagt, liker folk å spørre om det i jobbintervjuer.

"Så, det er bedre å vite om det enn å ikke vite det. Takk, Ellie!"