Borrar una matriz de elementos definidos

 

Hay un array que contiene un conjunto de datos de tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 hay que eliminar por ejemplo los valores 3 y obtener el mismo array sin 3 y espacios vacíos en la salida...

Estoy buscando la forma más rápida de borrar un array de valores innecesarios...

Me viene a la mente el siguiente ejemplo

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

¿Quizás haya una forma más barata y rápida?

 
Vladimir Pastushak:

Hay un array que contiene un conjunto de datos de tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 hay que eliminar por ejemplo los valores 3 y obtener el mismo array sin 3 y espacios vacíos en la salida...

Estoy buscando la forma más rápida de borrar un array de valores innecesarios...

Me viene a la mente el siguiente ejemplo

¿Quizás haya una forma más económica y rápida?

ArrayResize debe ser eliminado de los bucles, y (si se lucha por cada LONG, comprobar las condiciones y el único Resize al final)

Pero es un poco típico sacar todo de los bucles, lo que se puede hacer después en bloque o no hacerlo...

 

1. Reescribe la matriz uno[] en una matriz trabajo[] de la misma dimensión, eliminando los elementos innecesarios y desplazando los elementos necesarios en su lugar.

2. Reescribe el array trabajo[] en el array dos[] de la nueva dimensión.

HH: Eliminar la llamada a la función del operador de bucle(ArraySize).
 
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;
  }
 

Aquí hay una variante como esta:

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

Devuelve el número de elementos del array filtrado. Puede reducir automáticamente su tamaño si es dinámico.

 
Stanislav Korotky:

Aquí hay una variante como esta:

Devuelve el número de elementos del array filtrado. Puede reducir automáticamente su tamaño si es dinámico.

Unos cuantos más (unos cuantos diámetros más de suelo) y llegaremos a la funcionalidad :-)

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

es tcl, es aún más corto en lisp

 
La forma más rápida sería con ArrayCopy() y hacer un bucle en orden inverso, para no mover los elementos que se van a borrar.
 
Dmitry Fedoseev:
La forma más rápida sería con ArrayCopy() y un bucle de vuelta para evitar mover los elementos que se van a borrar.

no es adecuado, ya que puede haber una matriz de estructuras que contengan cadenas.

 
Uno tiene 42 productos, otro tiene 6, otro tiene 30. Me da miedo imaginarme lo gilipollas que es por dentro con todas esas preguntas y respuestas
 
TheXpert:
Uno tiene 42 productos, otro tiene 6, otro tiene 30. Me da miedo imaginarme el gilipollas que hay dentro con estas preguntas y respuestas

Una pregunta tonta es una pregunta no formulada.

Tengo varias soluciones al problema, pero sigo buscando mejores soluciones y aprendiendo de los demás.

 
Menos mal que sólo tengo uno :) ... producto y una opción de solución.
Razón de la queja: