doppelte einträge aussortieren
-
Moin moin,
Ich habe vor aus einer bestimmten Datei doppelte Einträge rauszufiltern.
ich versuche es mit dieser Funktion:
string s[2000]; while(getline(stream_in, s[zeile])) // Discards newline char { if(s[zeile] != "") zeile++; } ... void delete_duplicated(string *s,string filein, int zeile) { stream_out.open (filein.c_str()); for(int i = 0;i <=zeile-1;i++) { for(int x = i+1;x <=zeile;x++) { if(s[i] == s[x]) { for(int y = x;y <= zeile;y++) { s[y] = s[y+1]; //cout<<s[i]<<"\n"; } } } stream_out << s[i] <<"\n"; //cout<<s[i]<<"\n"; } stream_out.close(); }Irgendwas scheint hier noch nicht zu stimmen.
Wenn meine Datei so aussieht:a
b
c
d
e
f
g
g
g
g
g
g
g
gDann
bekomme ich folgende ausgabe:a
b
c
d
e
f
g
g
gWie man sieht sind immernoch 3 doppelte vorhanden.
Ich denke der Fehler liegt wahrscheinlich am Algorithmus selbst und nicht am c++-code.
Vieleicht kann mir ja hier jemand helfen.Danke im Vorraus !
Lusches
Danke schonmal...
-
Wie weiß dein Programm nach dem Aussortieren wie viele Einträge überhaupt noch gültig sind? Ich schätze dort liegt dein Problem.
Ein paar Tipps:
std::string erleichtert dir die Arbeit mit Zeichenketten sehr.
std::set kann dir helfen dein Problem mit doppelten Einträgen trivial zu lösen.
-
Ich verwende doch strings:
string s[2000];Ich glaube, dass ich weiß, was nicht richtig funktioniert.
Wenn ein doppelter string gefunden wurde (s[i] == s[x]) werden alle anderen strings um einen index nach unten verschobe (s[y] = s[y+1];).
Wenn jetzt aber...denke ich jedenfalls

-
Lusches schrieb:
Ich verwende doch strings:
Ups, da habe ich mich von den Arrayindizes dazu verleiten lassen, gar nicht mehr genau hinzugucken. Hat die Zahl 2000 bei deinem Programm eine besondere Bedeutung?
Zu deinem Problem:
Spricht was dagegen:set<string> my_set; string s; while(getline(my_stream, s)) { my_set.insert(s); } for (set<string>::iterator it=my_set.begin() ; it != my_set.end(); it++ ) cout << " " << *it; cout<<endl;Beispielseingabe:
g z d f g d t f g dAusgabe:
d f g t z
-
Da spricht eigentlich nichts dagegen.
Wenn du mir jetzt noch sagst wie ich das String array s[] damit auffüllen kann ist die sache gebongt
ich bekomme folgende Fehler wenn ich versuche einen code zu kompilieren:
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(168) : error C2065: 'set': nichtdeklarierter Bezeichner
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(168) : error C2275: 'std::string': Ungültige Verwendung dieses Typs als Ausdruck
c:\programme\microsoft visual studio 9.0\vc\include\xstring(2210): Siehe Deklaration von 'std::string'
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(168) : error C2065: 'my_set': nichtdeklarierter Bezeichner
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(174) : error C2065: 'my_set': nichtdeklarierter Bezeichner
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(174) : error C2228: Links von ".insert" muss sich eine Klasse/Struktur/Union befinden.
Typ ist ''unknown-type''
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(177) : error C2065: 'set': nichtdeklarierter Bezeichner
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(177) : error C2275: 'std::string': Ungültige Verwendung dieses Typs als Ausdruck
c:\programme\microsoft visual studio 9.0\vc\include\xstring(2210): Siehe Deklaration von 'std::string'
c:\dokumente und einstellungen\maik\eigene dateien\visual studio 2008\projects\makro(blog)\makro(blog)\makro(blog).cpp(177) : error C2955: "std::iterator": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.
c:\programme\microsoft visual studio 9.0\vc\include\xutility(688): Siehe Deklaration von 'std::iterator'Anscheinend erkennt er das "set" nicht. std::set kennt er auch nicht.

-
#include <set>Und ja, set liegt im Namespace std, musst du also entweder überall davoschreiben oder ein entsprechendes using benutzen.
-
Lusches schrieb:
Da spricht eigentlich nichts dagegen.
Wenn du mir jetzt noch sagst wie ich das String array s[] damit auffüllen kann ist die sache gebongt
Indem du das Array weglässt und wie beschrieben einen ordentlichen Container (z.B. besagtes std::set) benutzt.
-
Danke euch beiden

Ich habe das ganze jetzt folgendermaßen gelöst:void delete_duplicated(string *s,string filein, int zeile) { set<string> my_set; stream_out.open (filein.c_str()); for(int i = 0;i <= zeile;i++) my_set.insert(s[i]); int i = 0; for (set<string>::iterator it=my_set.begin() ; it != my_set.end(); it++ ) { s[i] = *it; stream_out<<s[i]<<"\n"; i++; } stream_out.close(); }Wenn ich die Container benutzen würde dann müsste ich ja den ganzen Quelltext der nach der Funktion kommt umschreiben. Hätte ich dadurch irgendwelche Vorteile ?
-
Lusches schrieb:
Wenn ich die Container benutzen würde dann müsste ich ja den ganzen Quelltext der nach der Funktion kommt umschreiben. Hätte ich dadurch irgendwelche Vorteile ?
Vorteil gegenüber festem array: du musst das array nicht mit irgendeiner fest codierten Zahl in der Größe begrenzen. Container passen sich in der Größe automatisch an.
Vorteil gegenüber dynamischem Array: du musst keine unabhängige Variable pflegen die weiß wie viele Elemente im Array sind, du musst die Speicheranforderung nicht selber machen und auch die Freigabe nicht, das macht das Array alles selber.Das Array hat demgegenüber keine nennenswerte Vorteile. Wenn du einen vector benutzt kannst du die Zugrife mit dem Indexoperator '[i]' weiter benutzen.