Убрать из Массива нулевые значения

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
LookingFor
93
LookingFor  

Коллеги добрый день 

Подскажите пожалуйста , как убрать из массива нулевые значения 

то есть есть array[1,4,2,0,2,0,2,0] Привязанный к барам 

а нужно получить array2[1,4,2,2,2] уже отвязанный от оси времени с убранными нулями .

Konstantin Erin
2164
Konstantin Erin  
LookingFor:

Коллеги добрый день 

Подскажите пожалуйста , как убрать из массива нулевые значения 

то есть есть array[1,4,2,0,2,0,2,0] Привязанный к барам 

а нужно получить array2[1,4,2,2,2] уже отвязанный от оси времени с убранными нулями .

вот тут это только-то усиленно обсуждали. Ваш случай надо просматривать массив, находить нули и копировать остаток массива со сдвигом на 1 элемент влево. После каждого копирования уменьшать размер массива
Maxim Kuznetsov
12916
Maxim Kuznetsov  
LookingFor:

Коллеги добрый день 

Подскажите пожалуйста , как убрать из массива нулевые значения 

то есть есть array[1,4,2,0,2,0,2,0] Привязанный к барам 

а нужно получить array2[1,4,2,2,2] уже отвязанный от оси времени с убранными нулями .

doube src[]={1,4,2,0,2,0,2,0};

double dst=ArraySize(src);

int srcIndex,dstIndex;

for(srcIndex=0,dstIndex=0;srcIndex<ArraySize(src);src++) {

  if (src[srcIndex]==0) continue; // нулевые элементы пропускаем

  dst[dstIndex++]=src[srcIndex]; // прочее копируем

}

ArrayResize(dst,dstIndex); // выравниваем массив-получатель

как-то так
Sergey Kolemanov
1015
Sergey Kolemanov  
Maxim Kuznetsov:

doube src[]={1,4,2,0,2,0,2,0};

double dst=ArraySize(src);

int srcIndex,dstIndex;

for(srcIndex=0,dstIndex=0;srcIndex<ArraySize(src);src++) {

  if (src[srcIndex]==0) continue; // нулевые элементы пропускаем

  dst[dstIndex++]=src[srcIndex]; // прочее копируем

}

ArrayResize(dst,dstIndex); // выравниваем массив-получатель

Может srcIndex++ ?
Maxim Kuznetsov
12916
Maxim Kuznetsov  
Sergey Kolemanov:
Может srcIndex++ ?
ну да...это-ж с руки, не копи-паст
Sergey Kolemanov
1015
Sergey Kolemanov  
Maxim Kuznetsov:

doube src[]={1,4,2,0,2,0,2,0};

double dst=ArraySize(src);

int srcIndex,dstIndex;

for(srcIndex=0,dstIndex=0;srcIndex<ArraySize(src);src++) {

  if (src[srcIndex]==0) continue; // нулевые элементы пропускаем

  dst[dstIndex++]=src[srcIndex]; // прочее копируем

}

ArrayResize(dst,dstIndex); // выравниваем массив-получатель

Извиняюсь за назойливость , но здесь тоже что-то не то: массив dst не объявлен ).


LookingFor
93
LookingFor  

Мужчины , Спасибо  ! идея понятна 

Konstantin Erin
2164
Konstantin Erin  
LookingFor:   Мужчины , Спасибо  ! идея понятна 
#property   strict
double src[]={1,4,2,0,0,5,0,3,0};

void OnStart()
{
  Alert("--------");
  out();                 // Вывод исходного массива
  int k=ArraySize(src);  // Номер последнего элемента

  for(int cnt=0; cnt<k; cnt++)
  {
    if (src[cnt]!=0) continue;         // нужные элементы пропускаем
    ArrayCopy(src,src,cnt,cnt+1);      // копирование массива со сдвигом влево
    ArrayResize(src,ArraySize(src)-1); // сокращаем массив
    cnt--;  k--;    // массив сдвинулся влево и мы отступаем влево
    out(); // Вывод промежуточного результата
  }
  out();  // Вывод окончательного результата
}


// Эта функция для вывода массива чтоб было понятно
void out()
{
  string st="";
  for(int i=0; i<ArraySize(src); i++)
  st+="  "+string(src[i]);
  Alert(st);
}

   внизу исходный массив, выше промежуточный, вверху результат

LookingFor
93
LookingFor  

Еще раз Спасибо !

Nikolai Semko
6530
Nikolai Semko  
LookingFor:

Коллеги добрый день 

Подскажите пожалуйста , как убрать из массива нулевые значения 

то есть есть array[1,4,2,0,2,0,2,0] Привязанный к барам 

а нужно получить array2[1,4,2,2,2] уже отвязанный от оси времени с убранными нулями .


Можно обойтись без создания нового массива.

void OnStart()
  {
   int src[];  // исходный динамический массив
   ArrayResize(src,8);  // задаем размерность
   src[0]=1; src[1]=4; src[2]=2; src[3]=0; src[4]=2; src[5]=0; src[6]=2; src[7]=0; // инициализируем исходный массив
   int size=ArraySize(src); // выясняем размерность, если не известна
   int j=-1;
   for(int i=0;i<size;i++)
     {
      if(j<0) {if(src[i]==0) j=i;}
      else if(src[i]!=0) {src[j]=src[i]; j++;}
     }
   ArrayResize(src,j);
// Проверяем правильность выполнения
   string s="";
   for(int i=0;i<j;i++) s+=IntegerToString(src[i])+"  ";
   Print(s);
  }

Вряд ли можно придумать что-то быстрее.
Nikolai Semko
6530
Nikolai Semko  
Nikolai Semko:

Можно обойтись без создания нового массива.

Вряд ли можно придумать что-то быстрее.

Пожалуй так всё же быстрее:

void OnStart()
  {
   int src[];  // исходный динамический массив
   ArrayResize(src,8);  // задаем размерность
   src[0]=1; src[1]=4; src[2]=2; src[3]=0; src[4]=2; src[5]=0; src[6]=2; src[7]=0; // инициализируем исходный массив
   int size=ArraySize(src);
   int i=0,j;
   while(i<size && src[i]!=0) i++;
   if (i==size) { Print (" Массив не содержит нулей, преобразование не требуется"); return;}
   j=i;
   for(;i<size;i++)
     {
      if(src[i]!=0) {src[j]=src[i]; j++;}
     }
   ArrayResize(src,j);
// Проверяем правильность выполнения
   string s="";
   for(i=0;i<j;i++) s+=IntegerToString(src[i])+"  ";
   Print(s);
  }

но если все же требуется с созданием нового массива, то самый быстрый и оптимальный вариант на мой взгляд:

void OnStart()
  {
   int src[]={1,4,2,0,2,0,2,0};  // исходный массив
   int size=ArraySize(src);
   int src2[];
   ArrayResize(src2,size);
   int i=0,j;
   while(i<size && src[i]!=0) i++;
   ArrayCopy(src2,src,0,0,i);
   if(i==size) 
     {
      Print(" Массив не содержит нулей");
      return;
     }
   j=i;
   for(;i<size;i++)
     {
      if(src[i]!=0) {src2[j]=src[i]; j++;}
     }
   ArrayResize(src2,j);
// Печатаем новый массив
   string s="";
   for(i=0;i<j;i++) s+=IntegerToString(src2[i])+"  ";
   Print(s);
  }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий