logo

Ako rozdeliť reťazec v C/C++, Pythone a Java?

Rozdelenie reťazca nejakým oddeľovačom je veľmi bežná úloha. Napríklad máme čiarkami oddelený zoznam položiek zo súboru a chceme jednotlivé položky v poli.
Takmer všetky programovacie jazyky poskytujú funkciu, ktorá rozdeľuje reťazec nejakým oddeľovačom.

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



>

if-else príkaz java

>

Output: Geeks for Geeks>

Časová zložitosť: O(n)

Pomocný priestor: 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.>

Metóda 1: Použitie stringstream API v C++

Predpoklad : stringstream API

Objekt Stringstream je možné inicializovať pomocou objektu typu reťazec, a to automaticky tokenizuje reťazce na medzerníku. Rovnako ako cin stream stringstream vám umožňuje čítať reťazec ako prúd slov. Alternatívne môžeme tiež použiť funkciu getline na tokenizáciu reťazca akýkoľvek jeden oddeľovač znakov .

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>> — vytiahne slovo zo streamu.>

Dokazuje to kód uvedený nižšie.

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

Časová zložitosť: O(n)

Pomocný priestor:O(n)

Kde n je dĺžka vstupného reťazca.

Metóda 2: Použitie C++ find() a substr() API.

Predpoklad: funkcia nájsť a substr() .

Táto metóda je robustnejší a dokáže analyzovať reťazec s akýmkoľvek oddeľovačom , nielen medzery (hoci predvolené správanie je oddeľovať medzery.) Logika je celkom jednoduchá na pochopenie z nižšie uvedeného kódu.

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

Časová zložitosť: O(n)

Pomocný priestor:O(1)

Kde n je dĺžka vstupného reťazca.

Metóda 3: Použitie dočasného reťazca

vstup java

Ak máte dané, že dĺžka oddeľovača je 1, potom môžete jednoducho použiť dočasný reťazec na rozdelenie reťazca. Tým sa ušetrí čas réžie funkcie v prípade metódy 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;> }>

>

>

Výkon

geeks for geeks>

Časová zložitosť: O(n)

Pomocný priestor: O(n)

V jazyku Java:
V jazyku Java je split() metóda v triede 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);> >}> }>

>

>

Výkon:

Geeks for-Geeks Geeks for Geeks>

Časová zložitosť: O(n)
Pomocný priestor: O(1)

V Pythone:
Metóda split() v Pythone vráti zoznam reťazcov po prerušení daného reťazca zadaným oddeľovačom.

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

>

>

Výkon:

mapa v jave
['Geek1', 'Geek2', 'Geek3'] ['Geek1', '
Geek2 
Geek3']>

Časová zložitosť: O(N) , pretože to len prechádza cez reťazec a nájde všetky medzery.

Pomocný priestor: O(1) , pretože nebolo použité žiadne miesto navyše.