Löschen eines Arrays mit definierten Element(en) - Seite 5

 
Konstantin Nikitin:
Es geht ausschließlich um die Aufgabe, um die es geht. Wert entfernen und leeren

Fügen Sie eine Funktion hinzu, mit der Sie nach einem Kriterium filtern können, und schon sind Sie startklar. Sie könnten es sogar in Ihre Sammlung aufnehmen :-)

etwas wie

int arrayFilter(T &data[], const T value, bool (*cmp)(const T&,const T&)=NotEqual<T>)

um alle Werte größer als 3 herauszufiltern: arrayFilter<long>(array,3,GreaterThen<long>).

Ich bin mir nicht sicher, ob die MQL-Vorlagen es erlauben, dies einfach zu tun

 
TheXpert:

Ich will mich nicht aufdrängen.

Danke, Sie sind heute sehr freundlich :-)

Über die Aufgabe. Imho ist es bequemer, mit einem Typ aus der Datensammlung wieCArrayDouble zu arbeiten.Mein Beispiel:

//--- https://www.mql5.com/ru/docs/standardlibrary/datastructures/carraydouble
#include <Arrays\ArrayDouble.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double delta=1 e-3;
   CArrayDouble ArrDouble;
   ArrDouble.Delta(delta);
   double src_arr[]={1,2,3,6,9,5,6,3,25,6,8,7,4};
   double value_to_delete=3.0;
   if(ArrDouble.AddArray(src_arr))
     {
      ArrDouble.Sort();
      if(ArrDouble.IsSorted())
        {
         int first_idx,last_idx;
         first_idx=ArrDouble.SearchFirst(value_to_delete);
         last_idx=ArrDouble.SearchLast(value_to_delete);
         if(first_idx>=0)
           {
            PrintFormat("\nЭлементов до удаления: %d",ArrDouble.Total());
            if(ArrDouble.DeleteRange(first_idx,last_idx))
                  PrintFormat("Удалено элементов: %d",last_idx-first_idx+1);             
            PrintFormat("Элементов после удаления: %d",ArrDouble.Total());         
           }
        }
     }
  }
//+------------------------------------------------------------------+

Allerdings gibt es auch einen Nachteil. Die Ausgabe wird ein sortiertes Array sein.

 
Denis Kirichenko:
Ohhh, manchmal ist es besser zu schweigen und wie ein Narr dazustehen als...
 
TheXpert:
Ohhh, manchmal ist es besser zu schweigen und wie ein Narr dazustehen als...

als etwas zu sagen und alle Zweifel auszuräumen....

 
Vladimir Pastushak:

Es gibt ein Array, das eine Reihe von Daten des Typs 1,2,3,6,9,5,6,3,25,6,8,7,4 enthält, die Sie benötigen, um z.B. Werte 3 zu entfernen und das gleiche Array ohne 3 und Leerzeichen in der Ausgabe zu erhalten...

Ich bin auf der Suche nach dem schnellsten Weg, um ein Array von unnötigen Werten zu löschen...

Das folgende Beispiel kommt mir in den Sinn

Vielleicht gibt es einen wirtschaftlicheren und schnelleren Weg?

Indem Sie das Array in einer Schleife durchlaufen und nicht benötigte Werte entfernen, überschreiben Sie den Wert in der nächsten Zelle an der Stelle des entfernten Wertes. Verschieben Sie alle Werte, die auf den gelöschten Wert folgen, nach links und zählen Sie die Anzahl der gelöschten Werte im Zähler.

Führen Sie dann ArrayResize() aus und berücksichtigen Sie dabei die Anzahl der gelöschten Werte.

Zy. Verschieben Sie die zu löschenden Werte nicht. Sie können alle Werte außer denen, die Sie löschen, nach links verschieben.

Die Verschiebung der Werte nach links sollte gleich der Anzahl der gelöschten Zellen sein.

 
Vladimir Pastushak:

Eine dumme Frage ist eine nicht gestellte Frage.

Ich habe mehrere Lösungen für das Problem, aber ich suche weiter nach besseren Lösungen und lerne von anderen.

Ähnliche Fragen stellen Sie bereits seit mehreren Jahren. Haben Sie viel gelernt? Es tut mir leid, aber Sie scheinen auf der Ebene von Bytes und elementaren Arrays geblieben zu sein.

Die Frage selbst ist falsch formuliert. Die Aufgabe besteht nicht darin, doppelte Werte zu entfernen (Aufgabe des GCE-Niveaus), sondern in etwas viel Größerem: Sie müssen die Liste der gültigen Elemente aktualisieren. Wenn ja, sollte die Frage ganz anders klingen. Sie verwirren und führen die Teilnehmer und vor allem sich selbst in die Irre: Sie drängen den Teilnehmern eine prinzipiell falsche Lösung auf und verlangen, dass diese wirksam wird.

 
Реter Konow:

Indem Sie das Array in einer Schleife durchlaufen und unerwünschte Werte daraus entfernen, überschreiben Sie den Wert in der nächsten Zelle anstelle des entfernten Wertes. Verschieben Sie alle Werte, die auf den gelöschten Wert folgen, nach links und zählen Sie die Anzahl der gelöschten Werte im Zähler.

Führen Sie dann ArrayResize() aus und berücksichtigen Sie dabei die Anzahl der gelöschten Werte.

Zy. Verschieben Sie die zu löschenden Werte nicht. Sie können alle Werte außer denen, die Sie löschen, nach links verschieben.

Die Verschiebung der Werte nach links sollte gleich der Anzahl der gelöschten Zellen sein.

 int Arr[20] = 1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2;
 int deleted;
//-------------- 
for(int a1 = 0; a1 < ArraySize(Arr); a1++)
  {
   if(deleted)Arr[a1] = Arr[a1 + deleted];
   
   if(Arr[a1] == 3)deleted++; 
  }
//-------------- 
ArrayResize(Arr, ArraySize(Arr) - deleted);

Aktivieren Sie diese Option.

 

Entschuldigung. Es sieht so aus, als müssten die Linien umgedreht werden:


 int Arr[20] = 1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2;
 int deleted;
//-------------- 
for(int a1 = 0; a1 < ArraySize(Arr); a1++)
  {
   if(Arr[a1] == 3)deleted++; 

   if(deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize(Arr, ArraySize(Arr) - deleted);
 
Реter Konow:

Entschuldigung. Es sieht so aus, als müssten die Linien umgedreht werden:

Rätsel: Wie viele Äpfel hat Pinocchio, wenn Pinocchio ihm zwei Äpfel gibt und Papa Carlo ihm drei gibt?
Antwort: Zehn. Die Quellvariablen müssen initialisiert werden.

 
Реter Konow:

Entschuldigung. Es sieht so aus, als müssten die Linien umgedreht werden:


Es muss noch mehr getan werden:

int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
int deleted;
//-------------- 
for(int a1 = 0; a1 < ArraySize(Arr); a1++)
  {
   if(Arr[a1] == 3)
     {
      if(deleted)a1-= deleted;//Cмещение назад.
      deleted++; 
     }
   if(deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize(Arr, ArraySize(Arr) - deleted);