Virknes sadalīšana ar kādu norobežotāju ir ļoti izplatīts uzdevums. Piemēram, mums ir ar komatu atdalīts vienumu saraksts no faila, un mēs vēlamies, lai masīvā būtu atsevišķi vienumi.
Gandrīz visas programmēšanas valodas nodrošina funkciju, kas virkni sadala ar kādu atdalītāju.
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;> }> |
>
satur java metodi
>
Output: Geeks for Geeks>
Laika sarežģītība: O(n)
Palīgtelpa: O(n)
Programmā 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.>
1. metode: Izmantojot C++ stringstream API
Priekšnoteikums : stringstream API
Stringstream objektu var inicializēt, izmantojot virknes objektu, tas automātiski marķieri virknes uz atstarpes char. Tāpat kā cin straume stringstream ļauj nolasīt virkni kā vārdu plūsmu. Alternatīvi mēs varam izmantot arī getline funkciju, lai aktivizētu virkni jebkuru vienu rakstzīmju atdalītāju .
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>> — izvelk vārdu no straumes.>
Tālāk redzamais kods to parāda.
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>> vārds) {> > 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!>
Laika sarežģītība: O(n)
Palīgtelpa: O(n)
Kur n ir ievades virknes garums.
2. metode: C++ find() un substr() API izmantošana.
Priekšnosacījums: atrast funkciju un substr() .
Šī metode ir izturīgāks un var parsēt virkni ar jebkuru atdalītāju , ne tikai atstarpes (lai gan noklusējuma darbība ir atdalīt ar atstarpēm.) Loģika ir diezgan vienkārši saprotama, izmantojot tālāk norādīto kodu.
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 !>
Laika sarežģītība: O(n)
Palīgtelpa: O(1)
Kur n ir ievades virknes garums.
3. metode: pagaidu virknes izmantošana
Ja jums ir norādīts, ka norobežotāja garums ir 1, tad virknes sadalīšanai varat vienkārši izmantot pagaidu virkni. Tas ietaupīs funkcijas papildu laiku 2. metodes gadījumā.
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;> }> |
>
bash masīvi
>Izvade
geeks for geeks>
Laika sarežģītība: O(n)
Palīgtelpa: O(n)
Java valodā:
Java valodā split () ir String klases metode.
// 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);> > }> }> |
>
>
Izvade:
Geeks for-Geeks Geeks for Geeks>
Laika sarežģītība: O(n)
Palīgtelpa: O(1)
Python:
Split() metode programmā Python atgriež virkņu sarakstu pēc tam, kad dotā virkne ir sadalīta ar norādīto atdalītāju.
// 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> ))> |
>
>
tabula reaģē
Izvade:
['Geek1', 'Geek2', 'Geek3'] ['Geek1', ' Geek2 Geek3']>
Laika sarežģītība: O(N) , jo tas vienkārši šķērso virkni, atrodot visas atstarpes.
Palīgtelpa: O(1) , jo nav izmantota papildu vieta.