Алгоритм удаления нулевых элементов

  • Автор темы Nort
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

Nort

Гость
#1
Пишу на непонятной приблуде(Jason) дипломный проект. Встал вопрос удаления всех нулевых элементов из масива. И удаления из еще трех массивов элементов с тем же индексом. Когда то решал такие задачки легко а сейчас родил токо достаточно сложный длагоритм в одним циклом и еще двумя вложеными. что то типа того(алгоритм напишу на подобие с++ на ясоне писать не буду - гемор)

<!--shcode--><pre><code class='с++'>int p = 0;
for(int i=0;i<array1.length();++i)
{
if(array1==0)
{
++p;
}
}

for(int j=0;j<p;++j)
{
for(int h=0;h<array1.length();++h)
{
if(array[h]==0)
{
delete(array1[h]);
delete(array2[h]);
delete(array3[h]);
delete(array4[h]);
break;
}
}
}[/CODE]

можно ли сделать проще?
 
A

astronom

Гость
#2
ИМХО, проще удаление элементов массивов сразу сунуть в первый цикл (и прибавить туда же проверку существования в массивах элемента с таким индексом)
Т.е., что-нибудь на тему:
Код:
for(int i=0;i<array1.length();++i)
{
if(array1[i]==0)
{
delete(array1[i]);
delete(array2[i]);
delete(array3[i]);
delete(array4[i]);
}
}
ну или еще лучше, засунуть удаление элемента в отдельную функцию и передавать ей переменную-массив и индекс удаляемого элемента
Т.е.,

Код:
int del(int array, int index) {
if (array.length() >= index) {
delete(array[index]);
return 0;
}
else {
return -1;
}
}

for(int i=0;i<array1.length();++i)
{
if(array1[i]==0) {
del array1[i];
del array2[i];
del array3[i];
del array4[i];
}
}
зы а ... ну и естественно, массив наверное стоит передавать по ссылке.

Собственно, вот эта строчка
Код:
 if(array[h]==0)
во втором цикле делает то же самое, что происходит в первом цикле.
Иными словами, вы в первом цикле получаете количество нулевых элементов в первом массиве, а потом, исходя из этого числа, проходите каждый массив целиком. В принципе это :KillMe: и насилие над гигагерцами :)
С другой стороны, можно сделать и так:
1. Проходимся по первому массиву, если найден элемент с нулевым значением, заносим его индекс в отдельный массив.
2. Проходим по полученному на шаге 1 массиву индексов и удаляем из всех подопытных массивов элемент с текущим значением индекса.
Способ извращенный, но тоже имеет право на существование.
 
N

Nort

Гость
#3
Безусловно вы правы. Будь дело в С++ я бы так и писал. Но дело происходит в невнятной среде написанной на яве из которой не существует однозначных выкладок. Например я не могу удалить элемент по его индексу. Я могу токо взять сам элемент по индексу одной функцией и удалить этот же элемент другой функцией.
Примерно так это и происходит.
Почему не подходит способ просто организовать один цикл и удалять оттуда элементы. Дело в том что при каждом проходе цикла среда НЕ УЧИТЫВАЕТ изменения длины массива. В итоге индексы сбиваются и не удаляется то что надо.
 
A

astronom

Гость
#4
Например я не могу удалить элемент по его индексу. Я могу токо взять сам элемент по индексу одной функцией и удалить этот же элемент другой функцией.
Тогда банальное копирование массива с пропуском тех элементов, которые равны нулю. :ph34r:
 
Статус
Закрыто для дальнейших ответов.