Как можно объединить все ненулевые значения в массиве с пустыми пространствами?
Привет, у меня есть домашнее задание, и у меня проблемы с одним из методов. Я хотел бы подсказки, а не фактические ответы / код.
Итак, у меня есть класс 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 просто найдите позицию следующего ненулевого значения и разбейте ее там. Затем поменяйте его на ноль. Лучший эффективный по времени код.