Как можно объединить все ненулевые значения в массиве с пустыми пространствами?

Привет, у меня есть домашнее задание, и у меня проблемы с одним из методов. Я хотел бы подсказки, а не фактические ответы / код.

Итак, у меня есть класс HorseBarn, который смешивается с массивом лошадей (тип лошади). Моя проблема в том, что у меня проблемы с методом консолидации.

Как будет выглядеть массив перед объединением: a, b, c, d - лошади

| | Нуль | б | нуль | с | d |

Как массив будет выглядеть после консолидации:

| | Б | с | d | нуль | нуль |

Поэтому моя логика заключается в создании вложенного цикла for. Первый цикл будет искать нулевое значение, как только первый цикл найдет нулевое значение, второй цикл будет искать лошадь, а затем поменяться с ней. Затем второй цикл завершится и вернется к первому циклу. Итак, вот что у меня есть сейчас, и оно не работает (оно просто заканчивается). Моя логика неверна или мой синтаксис вызывает проблемы?

public void consolidate()
{
    int j = 0;
    for(int i = 0; i < spaces.length;i++)
    {
        if( spaces[i] == null)
        {
            for(j = i; j < spaces.length && spaces[j] == null; j++)
            {

            }
            spaces[i] = spaces[j];
            spaces[j] = null;
        }

    }

2 ответа

Решение

Хорошо для начала, это должно дать исключение индекса за пределами границ, если последний ненулевой элемент найден и все еще остаются элементы:

например: horses = | a | null | null | null |

за i = 1, поскольку horse [1] -> horse [3] пустые, j сначала устанавливается в 1, а затем заканчивается j = 4 (из-за условия завершения j < horses.length())

Затем вы попытаетесь поменять местами лошади [1] с лошадьми [4], что выбрасывает индекс массива за пределы границ.

Во внутреннем цикле for просто найдите позицию следующего ненулевого значения и разбейте ее там. Затем поменяйте его на ноль. Лучший эффективный по времени код.

Другие вопросы по тегам