Löschen eines Arrays mit definierten Element(en)

 

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

int ArrayDeleteEmpty(int &one[])
  {
   int two[];   int c=0;
   for(int i=0; i<ArraySize(one); i++)
      if(one[i]!=NULL && one[i]!="")
        {
         c++;
         if(ArrayResize(two,c,10000)>=0)
            two[c-1]=one[i];
        }
   for(int i=0; i<ArraySize(two); i++)
      if(ArrayResize(one,i+1,10000)>=0)
         one[i]=two[i];
   return c;
  }

Vielleicht gibt es einen billigeren und schnelleren Weg?

 
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?

ArrayResize sollte aus Schleifen entfernt werden, und (wenn kämpfen für jeden LONG, Bedingungen prüfen und einzelne Resize am Ende)

Aber es ist typisch, dass man alles aus den Schleifen herausnimmt, was man später in großen Mengen machen kann oder gar nicht machen muss...

 

1. Umschreiben von array one[] in array work[] der gleichen Dimension, wobei unnötige Elemente entfernt und die benötigten Elemente an deren Stelle verschoben werden.

2. Umschreiben von array work[] in array two[] der neuen Dimension.

HH: Funktionsaufruf vom Schleifenoperator(ArraySize) entfernen.
 
int ArrayDeleteEmpty(const int del, int &one[])
  {
   int i = ArrayBsearch(one, del),
       y = ArraySize(one)-1;
   
   if(one[i] != del)
     return 0;
   
   for(; i<y; i++)
      one[i] = one[i+1];
   ArrayResize(one, y);
   
   return y;
  }
 

Hier ist eine solche Variante:

template<typename T>
int arrayFilter(T &data[], const T value)
{
  int dst = 0, src = 0;
  for(; src < ArraySize(data); src++)
  {
    if(data[src] != value)
    {
      if(dst != src)
      {
        data[dst] = data[src];
      }
      dst++;
    }
  }
  
  if(dst < src)
  {
    ArrayResize(data, dst); // will only work with dynamic array
  }
  return dst;
}

void OnStart()
{
  long array[] = {1, 2, 3, 6, 9, 5, 6, 3, 25, 6, 8, 7, 4};
  ArrayPrint(array, 0, NULL, 0, arrayFilter<long>(array, 3));
}

Gibt die Anzahl der Elemente in dem gefilterten Array zurück. Kann automatisch verkleinert werden, wenn sie dynamisch ist.

 
Stanislav Korotky:

Hier ist eine solche Variante:

Gibt die Anzahl der Elemente in dem gefilterten Array zurück. Kann automatisch verkleinert werden, wenn sie dynamisch ist.

Noch ein paar mehr (ein paar mehr Durchmesser des Bodens) und wir werden funktionsfähig sein :-)

set target [ filter $source [ lambda x { expr $x !=3 } ]

es ist tcl, in Lisp ist es noch kürzer

 
Am schnellsten ginge es mit ArrayCopy() und einer Schleife in umgekehrter Reihenfolge, damit die Elemente, die gelöscht werden, nicht verschoben werden.
 
Dmitry Fedoseev:
Am schnellsten ginge es mit ArrayCopy() und einer Schleife in umgekehrter Reihenfolge, damit die Elemente, die gelöscht werden, nicht verschoben werden.

ist nicht geeignet, da es eine Reihe von Strukturen geben kann, die Zeichenketten enthalten.

 
Eine hat 42 Produkte, eine hat 6, eine hat 30. Ich habe Angst, mir vorzustellen, was für ein Arschloch es im Inneren ist, mit all diesen Fragen und Antworten
 
TheXpert:
Eine hat 42 Produkte, eine andere hat 6, eine andere 30. Ich habe Angst, mir vorzustellen, was für ein Arschloch in diesen Fragen und Antworten steckt

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.

 
Zum Glück habe ich nur einen :) ... Produkt und eine Lösungsoption.