Объясните, пожалуйста, как эта задача работает.
1) Я ввел первый цикл, который считает значения index. Добавил переменную currentString, равную значению array[index].
2) Я ввел второй цикл, который прерывается при currentString, равном значению null. Если значение currentString совпадает со значением array[next], то array[index] и array[next] равны null.
3) Допустим. Размер массива равен 4. Значение array[index] равно 0. Тогда значение currentString равно array[index]. Включается внутренний цикл.
4) Если currentString равен array[next], то есть array[index + 1], то значение array[index] и array[next] равны нулю. Внутренний цикл прерывается, потому currentString равен null.
5) Поскольку array[next] является производной от массива array[index], причина: мы в условиях указали, что next = index + 1, то
после окончания первого витка внутреннего цикла у нас обновляются условия во внешнем: array[0] и array[1] равны null.
6) Поскольку array[1] после первого витка внутреннего цикла равен null, то виток внутреннего цикла выполняться не будет.
7) Поскольку array[2] нам еще не известен, то начинает выполняться внутренний цикл. Если array[2] равен array[1], то их значение будет равно null. Если нет, то значение array[2] не изменится и продолжатся витки внутреннего цикла. Но данное суждение не является верным, потому что изначально в условиях мы определили, что int next = index + 1, следовательно, сопоставление при втором витке внутреннего цикла (первый виток дал нам array[0], равный null и автоматический пропуск внутреннего цикла при array[1], равном null), будет следующим:
Мы начнем сравнивать в строгой последовательности array[2] и array[2 +1], то есть array[3]. Тогда
А) если они идентичны, то будет выполняться следующее условие: array[2] и array[3] равны null. Поскольку оба равны null, то внешний цикл завершается. Мы публикуем результат с обновленным array[index].
Б) если они неодинаковые, то будет выполняться прокрутка внутреннего цикла дальше, тогда мы перейдем к четвертому витку внешнего цикла array[3]. Но поскольку размер массива: 0,1,2,3. Тогда array[3] будет не засчитанной. В итоге, внешний цикл также закрывается, только результат будет array[2] и array[3] не равны null.
Я правильно понимаю, что будет все так работать? Главный принцип здесь - это создание двух взаимосвязанных циклов, где оба индикатора следующие: int index = 0 (начало отсчета массива с самого первого элемента) и int next = index + 1 (продолжение отсчета того же массива со второго элемента). Потому что связка: int index = 0 и int next = index + 1 дают некорректное решение проблемы.
Надеюсь, мой текст не был таким скучным и ясность будет внесена. Спасибо!)
for (int index = 0; index < array.length; index++) {
String currentString = array[index];
for (int next = index + 1; next < array.length; next++) {
if (currentString == null){
continue;
}
if (currentString.equals(array[next])){
array[index] = null;
array[next] = null;
}
}
System.out.println(array[index]);
}
}
}
Anonymous #2492578
36 уровень
Можете объяснить принцип решения задачи?
Архивный
Комментарии (20)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Sergey Shlapkov
29 марта 2021, 12:05
Интересно, что у меня решение не приняло. Хотя по сути написано так же, только лишнюю проверку влепил
0
Умалатработаю в totamtosyam
17 января 2021, 07:06
Да так и будет.
0
Anonymous #2492578
17 января 2021, 08:16
Спасибо
0
Умалатработаю в totamtosyam
17 января 2021, 19:22
Успехов
0
Anonymous #2492578
16 января 2021, 18:56
0
Умалатработаю в totamtosyam
16 января 2021, 18:53
Зачем вы так делаете, это не кто читать не будет. Прикрепляйте код. Что бы понять тз и код.
0
Anonymous #2492578
16 января 2021, 18:55
Прошу прощения, думал, что код с заданием прикрепился.
Условия следующие: создать массив из 10 строк, строки будут вводиться с консоли. Если строки одинаковые, то им нужно присвоить значение null. Я посмотрел решение задачи, прикрепил соответствующий код. Не пойму, как осуществляется его считывание.
0
Умалатработаю в totamtosyam
16 января 2021, 19:17
Напиши какая именно часть кода не понятна
0
Anonymous #2492578
16 января 2021, 19:20
где идет сравнение переменной currentString с другими строками. я хочу понять, как детально работает внутренний цикл.
Внешний виток равен 0, значит значение currentString = array[0]. Включается внутренний цикл, проводится сравнение array[0] с array[0 + 1], они равны. Значит оба равны ноль. Что происходит дальше?
0
Умалатработаю в totamtosyam
16 января 2021, 19:42
Алгоритм этого цикла таков: Ты берешь строку которая лежит в массиве под индексом[0] присваиваешь ее переменной currentString. Потом заходишь во внутренний цикл(условие цикла такое же как и внешнее, просто отчет идет уже от индекса[1]) и сравниваешь переменную currentString сначала со значением null, если она true(истина) то ты возвращаешься во внутренний цикл, только теперь индекс у переменой next[2] так как next++, потом опять сравниваешь currentString = strings[0] с null, и если тут он даст false то перейдешь в след. условие else if, и тут уже ты сравниваешь currentString = strings[0] с strings[next] ( индекс у next тут будет 2)
0
Умалатработаю в totamtosyam
16 января 2021, 19:47
Т.е. ты сначала проверяешь 0 индекс внешнего цикла со всеми индексами внутреннего( но не самим собой, переменная next у тебя всегда на единицу больше чем переменная index), после того как внутренний цикл заканчивается, идет итерация внешнего цикла и уже 1 индекс сравниваешь со всеми. И так пока не закончиться внешний цикл
0
Умалатработаю в totamtosyam
16 января 2021, 19:51
Я надеюсь ты понимаешь что мы сравниваем содержимое массивов, а не их индексы
0
Anonymous #2492578
16 января 2021, 19:52
конечно! индекс массива отсылает к конкретной его ячейке, которая имеет конкретное значение. спасибо большое за пояснения, сейчас вчитываюсь и пытаюсь все понять
0
Умалатработаю в totamtosyam
16 января 2021, 19:55
Если это поймешь потом с пузырьковой сортировкой легче будет, такой же алгоритм.
0
Anonymous #2492578
16 января 2021, 19:58
Да, я все хочу понять! Мне это очень важно. Но в данном случае я не понимаю, почему если мы уберем из внутреннего цикла вот эту часть кода, то он перестанет работать.
0
Умалатработаю в totamtosyam
16 января 2021, 20:09
Потому что если его уберешь то ты не проверяешь является ли строка уже null(т.е. пустота), и поэтому ты не можешь ее сравнивать с другой строкой используя метод equals. И соответственно оно выбрасывает исключение, так как ты пытаешься на пустоту вызвать метод.
0
Умалатработаю в totamtosyam
16 января 2021, 20:13
Он нужен что бы проверить является ли строка пустой, если она не пустая то ты уже можешь вызвать на нее метод equals.
0
Умалатработаю в totamtosyam
16 января 2021, 20:14
Если пока не понятно с этим, сильно не заморачивайся
0
Anonymous #2492578
16 января 2021, 20:31
Спасибо за пояснения! Машина думает не так, как я, вот хочу понять все до мелочей
0
Anonymous #2492578
16 января 2021, 20:36
Тогда я правильно понимаю, что схема следующая:
Допустим, размер массива - 5. Слова: Джава, Джава, Бег, Выход, Джава.
1) Запускается 1 виток внешнего цикла. В currentString заносится значение первого элемента массива.
2) Включается внутренний цикл. Результат: null, null, Бег, Выход, null. Данные витка сразу заносятся в значения массива.
3) Запускается 2 виток внешнего цикла. В currentString заносится значение второго элемента массива, который уже равен null. Внутренний цикл обрывается.
4) 2-3 прогоняются, значения их ячеек в массиве не меняется.
5) Запускается 5 виток внешнего цикла. В currentString заносится значение второго элемента массива, который уже равен null. Внутренний цикл обрывается.
+1