mehrfach vorhandene Strings ignorieren



  • Hallo zusammen,

    habe ein kleines Problem an das ich mich rangetastet habe, leider stecke ich jetzt fest. Ich habe folgende Daten:

    WKZ[0]=T7070113
    WKZ[1]=T7070120
    WKZ[2]=T7070325
    WKZ[3]=T7070325
    WKZ[4]=T7070325
    WKZ[5]=T1035214
    ...
    Daten können sich auch ändern....

    Ich möchte gerne die doppelt vorkommenen Daten ignorieren und nur einmal ausgeben.

    SOLL:
    WKZ[0]=T7070113
    WKZ[1]=T7070120
    WKZ[2]=T7070325
    WKZ[3]=T1035214

    Mit folgendem Code habe ich dies versucht:

    std::ofstream outfile;
    outfile.open("M:\XXL.txt",ios::app);
    outfile << WKZ[0] << endl;
    outfile.close();
    
    		for(i=1;i<=50;i++)
    		 {
    			w=0;
    			for(r=0;r<i;r++)
    			 {
    			     if(WKZ[i]!=WKZV[r])
    				{w=1;
    				}
    			     if(WKZ[i]==WKZV[r])
    				{
    				 w=0; break;
    				}
    			 }
    
    			  if(w=0)
    			  {
    			  }
    			  if(w=1)
    			  { std::ofstream outfile;
                    outfile.open("M:\XXL.txt",ios::app);
    		        outfile << WKZ[i] << endl;			
                    outfile.close();
                  }
                }
    

    Die Strings WKZV[] sind identisch mit den WKZ[]. Habe ich nur zum Vergleich mit eingebaut.Leider schreibt er immer noch alle Daten doppelt und dreifach in das Textfile ?! Was mache ich falsch ?

    Ergebnis Textdatei:
    T7070113
    T7070120
    T7070325
    T7070325
    T7070325
    T1035214
    T7070121
    T7070121
    T7070121
    T7070121
    T7070122
    T7070122
    T7070122
    T7070122
    T7030062
    T7030061
    T7040072
    T7050094
    T7060101
    T7060101
    T7060102
    T7040073
    T7010009
    T7050091
    T7040073

    Vielen Dank im Voraus,
    Benjamin



  • Ich verstehe nicht ganz was du da mit dem WKZV machst bzw. vorhast. Ich würde die Werte WKZ in eine Liste oder ein Array stecken. Dann würde ich durch diese Liste iterieren und die Elemente in eine zweite Liste kopieren, wenn diese dort noch nicht drin vorkommen. Damit dürften dann auch die mehrfach vorkommenden Listenelemente eliminiert sein.



  • Benutze doch einfach ein std::set<..>.
    Simon



  • if(w=0) sowie if(w=1) sind Zuweisungen und keine Vergleichsoperatoren. Damit sind beide Bedingungen erfüllt. Das ist das was mir aufgefallen ist. Den restlichen Code hab ich mir nicht angesehen und auf Logik überprüft.


  • Mod

    theta schrieb:

    Benutze doch einfach ein std::set<..>.
    Simon

    Weil es u.U. langsamer ist und ineffizient... Solche Lösungen sind oft ineffektiv weil die ganzen stl Container unmassen an Allokationen durchführen!
    Aber ich vermute hier komt es weder auf Speed noch auf Speicher an bei 50 Elementen.

    Die schnellste Lösuwäre vermutich den Array in Place zu sortieren und dann einfach aneinander liegende Duplikate zu übergehen.



  • Hallo zusammen,

    der Fehler kommt tatsächlich daher, dass if(w=0) eine Zuweisung war und kein
    Vergleich. Mit zwei Gleicheitszeichen passt der Quellcode.

    Ich denke ich werde den Code demnächst mal ändern und vereinfachen. Für mein Anliegen reicht dieser Code aber erstmal.

    Thanks@all


Anmelden zum Antworten