logo

Cum se împarte un șir în C/C++, Python și Java?

Împărțirea unui șir de un delimitator este o sarcină foarte comună. De exemplu, avem o listă de elemente separate prin virgulă dintr-un fișier și dorim elemente individuale într-o matrice.
Aproape toate limbajele de programare oferă o funcție de împărțire a unui șir de un anumit delimitator.

În C:

// Splits str[] according to given delimiters. // and returns next token. It needs to be called // in a loop to get all tokens. It returns NULL // when there are no more tokens. char * strtok(char str[], const char *delims);>

C








// A C/C++ program for splitting a string> // using strtok()> #include> #include> int> main()> {> >char> str[] =>'Geeks-for-Geeks'>;> >// Returns first token> >char> *token =>strtok>(str,>'-'>);> > >// Keep printing tokens while one of the> >// delimiters present in str[].> >while> (token != NULL)> >{> >printf>(>'%s '>, token);> >token =>strtok>(NULL,>'-'>);> >}> >return> 0;> }>



>

alinierea imaginilor în css

>

Output: Geeks for Geeks>

Complexitatea timpului: Pe)

Spațiu auxiliar: Pe)

În C++

Note: The main disadvantage of strtok() is that it only works for C style strings. Therefore we need to explicitly convert C++ string into a char array. Many programmers are unaware that C++ has two additional APIs which are more elegant and works with C++ string.>

Metoda 1: Folosind stringstream API de C++

Condiție prealabilă : stringstream API

Obiectul Stringstream poate fi inițializat folosind un obiect șir, acesta automat tokenizează șiruri pe spațiu char. La fel cum cin stream stringstream vă permite să citiți un șir ca un flux de cuvinte. Alternativ, putem folosi și funcția getline pentru a tokeniza șirul orice delimitator de caractere .

Some of the Most Common used functions of StringStream. clear() — flushes the stream str() — converts a stream of words into a C++ string object. operator <<— pushes a string object into the stream. operator>> — extrage un cuvânt din flux.>

Codul de mai jos o demonstrează.

C++




#include> using> namespace> std;> // A quick way to split strings separated via spaces.> void> simple_tokenizer(string s)> {> >stringstream ss(s);> >string word;> >while> (ss>> cuvânt) {> >cout << word << endl;> >}> }> // A quick way to split strings separated via any character> // delimiter.> void> adv_tokenizer(string s,>char> del)> {> >stringstream ss(s);> >string word;> >while> (!ss.eof()) {> >getline(ss, word, del);> >cout << word << endl;> >}> }> int> main(>int> argc,>char> const>* argv[])> {> >string a =>'How do you do!'>;> >string b =>'How$do$you$do!'>;> >// Takes only space separated C++ strings.> >simple_tokenizer(a);> >cout << endl;> >adv_tokenizer(b,>'$'>);> >cout << endl;> >return> 0;> }>

>

>

Output : How do you do!>

Complexitatea timpului: O(n)

Spațiu auxiliar: O(n)

Unde n este lungimea șirului de intrare.

Metoda 2: Utilizarea API-urilor C++ find() și substr().

Condiție preliminară: funcția de găsire și substr() .

set c++

Această metodă este mai robust și poate analiza un șir cu orice delimitator , nu doar spații (deși comportamentul implicit este să se separe pe spații.) Logica este destul de simplu de înțeles din codul de mai jos.

C++




#include> using> namespace> std;> void> tokenize(string s, string del =>' '>)> {> >int> start, end = -1*del.size();> >do> {> >start = end + del.size();> >end = s.find(del, start);> >cout << s.substr(start, end - start) << endl;> >}>while> (end != -1);> }> int> main(>int> argc,>char> const>* argv[])> {> >// Takes C++ string with any separator> >string a =>'How$%do$%you$%do$%!'>;> >tokenize(a,>'$%'>);> >cout << endl;> >return> 0;> }>

>

>

Output: How do you do !>

Complexitatea timpului: O(n)

Spațiu auxiliar: O(1)

Unde n este lungimea șirului de intrare.

Metoda 3: Folosirea șirului temporar

Dacă vi se spune că lungimea delimitatorului este 1, atunci puteți utiliza pur și simplu un șir temporar pentru a împărți șirul. Acest lucru va economisi timpul general al funcției în cazul metodei 2.

C++




#include> using> namespace> std;> void> split(string str,>char> del){> >// declaring temp string to store the curr 'word' upto del> >string temp =>''>;> > >for>(>int> i=0; i<(>int>)str.size(); i++){> >// If cur char is not del, then append it to the cur 'word', otherwise> >// you have completed the word, print it, and start a new word.> >if>(str[i] != del){> >temp += str[i];> >}> >else>{> >cout << temp <<>' '>;> >temp =>''>;> >}> >}> > >cout << temp;> }> int> main() {> >string str =>'geeks_for_geeks'>;>// string to be split> >char> del =>'_'>;>// delimiter around which string is to be split> > >split(str, del);> > >return> 0;> }>

>

>

Ieșire

geeks for geeks>

Complexitatea timpului: Pe)

Spațiu auxiliar: Pe)

În Java:
În Java, split() este o metodă din clasa String.

// expregexp is the delimiting regular expression; // limit is the number of returned strings public String[] split (String regexp, int limit); // We can call split() without limit also public String[] split (String regexp)>

Java




// A Java program for splitting a string> // using split()> import> java.io.*;> public> class> Test> {> >public> static> void> main(String args[])> >{> >String Str =>new> String(>'Geeks-for-Geeks'>);> >// Split above string in at-most two strings> >for> (String val: Str.split(>'-'>,>2>))> >System.out.println(val);> >System.out.println(>''>);> > >// Splits Str into all possible tokens> >for> (String val: Str.split(>'-'>))> >System.out.println(val);> >}> }>

ymail
>

>

Ieșire:

Geeks for-Geeks Geeks for Geeks>

Complexitatea timpului: Pe)
Spațiu auxiliar: O(1)

În Python:
Metoda split() din Python returnează o listă de șiruri după ruperea șirului dat de separatorul specificat.

 // regexp is the delimiting regular expression; // limit is limit the number of splits to be made str. split (regexp = '', limit = string.count(str))>

Python3




line>=> 'Geek1 Geek2 Geek3'> print>(line.split())> print>(line.split(>' '>,>1>))>

>

>

Ieșire:

['Geek1', 'Geek2', 'Geek3'] ['Geek1', '
Geek2 
Geek3']>

Complexitatea timpului: O(N) , deoarece doar traversează șirul găsind toate spațiile albe.

Spațiu auxiliar: O(1) , deoarece nu a fost folosit spațiu suplimentar.