Borrar una matriz de elementos definidos - página 5

 
Konstantin Nikitin:
Se trata únicamente de la tarea que se está llevando a cabo. Eliminar el valor y vaciar

añada una función para poder filtrar por criterio y estará listo. Incluso podría añadirlo a su colección :-)

algo así como

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

para sacar todos los valores mayores de 3: arrayFilter<long>(array,3,GreaterThen<long>).

No estoy seguro de que las plantillas MQL permitan hacerlo fácilmente

 
TheXpert:

No estoy imponiendo.

Gracias, hoy es usted muy amable :-)

Sobre la tarea. Imho es más conveniente operar con un tipo de la colección de datos comoCArrayDouble. Mi ejemplo:

//--- 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());         
           }
        }
     }
  }
//+------------------------------------------------------------------+

Sin embargo, hay un inconveniente. La salida será un array ordenado.

 
Denis Kirichenko:
Ohhh, a veces es mejor callar y quedar como un tonto que...
 
TheXpert:
Ohhh, a veces es mejor callar y quedar como un tonto que...

que decir algo y aclarar cualquier duda....

 
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?

Al recorrer la matriz y eliminar los valores innecesarios, se sobrescribe el valor de la siguiente celda en el lugar del eliminado. Desplaza hacia la izquierda todos los valores que siguen al valor borrado y cuenta el número de valores borrados en el contador.

Luego haz ArrayResize() teniendo en cuenta el número de valores borrados.

Zy. No mueva los valores que desea borrar. Puedes desplazar hacia la izquierda todos los valores excepto los que borres.

El desplazamiento de los valores hacia la izquierda debe ser igual al número de celdas borradas.

 
Vladimir Pastushak:

Una pregunta tonta es una pregunta no formulada.

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

Lleva varios años haciendo preguntas similares. ¿Has aprendido mucho? Lo siento, pero parece que te has quedado en el nivel de los bytes y las matrices elementales.

La propia pregunta está formulada de forma incorrecta. La tarea no consiste en eliminar los valores repetidos (tarea de nivel CME) sino en algo mucho mayor, debe actualizar la lista de elementos válidos. Si es así, la pregunta debería sonar completamente diferente. Usted confunde y engaña a los participantes y, en primer lugar, a usted mismo: impone a los participantes una solución equivocada en principio y les pide que la hagan efectiva.

 
Реter Konow:

Al recorrer la matriz y eliminar los valores no deseados de la misma, sobrescribe el valor de la siguiente celda en lugar del valor eliminado. Desplaza hacia la izquierda todos los valores que siguen al valor borrado y cuenta el número de valores borrados en el contador.

Luego haz ArrayResize() teniendo en cuenta el número de valores borrados.

Zy. No mueva los valores que desea borrar. Puedes desplazar hacia la izquierda todos los valores excepto los que borres.

El desplazamiento de los valores hacia la izquierda debe ser igual al número de celdas borradas.

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

Marque esta opción.

 

Lo siento. Parece que hay que invertir las líneas:


 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:

Lo siento. Parece que hay que invertir las líneas:

Adivinanza: ¿Cuántas manzanas tendrá Pinocho si éste le da dos manzanas y Papá Carlo le da tres?
Respuesta: Diez. Es necesario inicializar las variables de origen.

 
Реter Konow:

Lo siento. Parece que hay que invertir las líneas:


Hay que seguir trabajando:

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);
Razón de la queja: