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

Тема в разделе "Свободное общение", создана пользователем Nort, 4 май 2011.

Статус темы:
Закрыта.
  1. Nort

    Nort Гость

    Пишу на непонятной приблуде(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]

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

    astronom Гость

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

    Код (Text):
    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];
    }
    }
    зы а ... ну и естественно, массив наверное стоит передавать по ссылке.

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

    Nort Гость

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

    astronom Гость

    Тогда банальное копирование массива с пропуском тех элементов, которые равны нулю. :ph34r:
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей