logo

Kako razdeliti niz v C/C++, Python in Java?

Razdelitev niza z ločilom je zelo pogosta naloga. Na primer, imamo z vejicami ločen seznam elementov iz datoteke in želimo posamezne elemente v matriki.
Skoraj vsi programski jeziki ponujajo funkcijo, ki razdeli niz z nekaterim ločilom.

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



>

linux bližnjice

>

Output: Geeks for Geeks>

Časovna zahtevnost: O(n)

Pomožni prostor: O(n)

V 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. način: Uporaba stringstream API-ja C++

Predpogoj : stringstream API

Objekt Stringstream je mogoče inicializirati z uporabo objekta niza, samodejno tokenizira nize na presledek char. Tako kot cin stream vam stringstream omogoča branje niza kot toka besed. Namesto tega lahko uporabimo tudi funkcijo getline za tokeniziranje niza poljubno ločilo posameznega znaka .

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>> — izvleče besedo iz toka.>

Spodnja koda to prikazuje.

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>> beseda) {> >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!>

Časovna zahtevnost: O(n)

Pomožni prostor: O (n)

Kjer je n dolžina vhodnega niza.

2. način: Uporaba API-jev C++ find() in substr().

Predpogoj: najdi funkcijo in substr() .

Ta metoda je bolj robusten in lahko razčleni niz s poljubnim ločilom , ne le presledki (čeprav je privzeto vedenje ločevanje na presledke.) Logika je precej preprosta za razumevanje iz spodnje kode.

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 !>

Časovna zahtevnost: O(n)

Pomožni prostor: O(1)

Kjer je n dolžina vhodnega niza.

3. način: Uporaba začasnega niza

Če vam je podano, da je dolžina ločila 1, lahko preprosto uporabite začasni niz, da razdelite niz. To bo prihranilo čas, ki je potreben za funkcijo v primeru 2. metode.

C++


opozorilno polje javascript



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

>

>

Izhod

geeks for geeks>

Časovna zahtevnost: O(n)

Pomožni prostor: O(n)

V Javi:
V Javi je split() metoda v razredu 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);> >}> }>

>

dolžina niza java

>

Izhod:

Geeks for-Geeks Geeks for Geeks>

Časovna zahtevnost: O(n)
Pomožni prostor: O(1)

V Pythonu:
Metoda split() v Pythonu vrne seznam nizov, potem ko dani niz prekine z navedenim ločilom.

 // 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>))>

>

>

Izhod:

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

Časovna zahtevnost: O(N) , saj samo prečka niz in najde vse presledke.

Pomožni prostor: O(1) , ker ni bil uporabljen dodaten prostor.