public class Memory {
public static void main(String[] args) {
String[] memory = {"object15", null, null, "object2", null, null, null, "object32", null, "object4"};
executeDefragmentation(memory);
System.out.println(Arrays.toString(memory));
}
public static void executeDefragmentation(String[] array) {
boolean isDefragmented = false;
String buf;
while (!isDefragmented) {
isDefragmented = true;
for (int i = 0; i < array.length - 1; i++) {
if(array[i] == null) {
isDefragmented = false;
buf = array[i];
array[i] = array[i + 1];
array[i + 1] = buf;
}
System.out.println(Arrays.toString(array));
}
}
}
}
Rustam Kurmankulov
18 уровень
У меня получается бесконечный цикл,как из него выйти?
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Виктор
6 июня 2022, 17:34
сортировку пузырьком еще никто не отменял )))
+1
Денис Enterprise Java Developer
6 июня 2022, 15:16
Ну тут все достаточно просто, внутри for цикла ты ставишь isDefragmented в false встречая любой null, а в true ты ее ставишь только в начале каждой итерации цикла while.
Когда твой массив "дефрагментирован" у тебя всегда в конце будут идти null, т.е. всегда будет isDefragmented = false, а значит будешь вечно гонять цикл while.
Я бы решал эту задачу иначе, скорее всего через два вложенных for цикла, тогда не пришлось бы городить огород с флагами.
+1
Volodymyr Doroshenko
6 июня 2022, 17:28
Ну да, через два for как-то проще, да и временная переменная buf не нужна:
Если ячейка с индексом j == null, то мы её меняем местами со следующей [j + 1] и зачем нам её значение записывать в промежуточную переменную, если это по условию проверки всегда null? +1
Виктор
6 июня 2022, 17:40
.
0
Денис Enterprise Java Developer
6 июня 2022, 17:50
Любопытный подход, но на больших массивах не очень производительный, потому как вы нуллы будете гонять через весь массив по одному, при том всегда цепляя найденный вами же нулл элемент, стартуют то оба цикла с одного и того же индекса
Я подумывал про что-то вроде такого:
Вложенный цикл тут включается только если мы встретили нулл, он идет от текущей позиции до ближайшего не нулл элемента и свопает их, после чего завершается. В целом тоже прогонка нулла через весь массив, но действий с виду меньше. +2
Виктор
6 июня 2022, 18:24
так то да - походу у Вашего действий меньше, я в своем просто реально пузырьком прошелся, just for fun )))
0
Volodymyr Doroshenko
6 июня 2022, 18:32
Ваше решение, безусловно, оптимальнее. Но, вероятно, и это ещё не предел. Ну и производительность тут сильно зависит от количества null в исходном массиве и их распределения.
0