Уважаемые программисты, обучающиеся и обучающиеся программисты, подскажите, пожалуйста, почему это дело не считается за удвоение элемента и что вообще нужно валидатору, в каком направлении мыслить и пытаться решить? Пока додумался только до такой структуры: ![]()
Andy
28 уровень
Про удваивание элемента
Решен
Комментарии (27)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
8 декабря 2021, 17:17
Показывай код полностью. Проблема, вероятно, не в этой его части.
0
Andy
9 декабря 2021, 01:52
0
hidden #598481
9 декабря 2021, 04:36решение
Потому что ты всегда скачешь через один элемент.
Да, если ты добавил туда строку, произойдет сдвиг остальных элементов, а если не добавил? Следующую за текущей строку тоже ведь надо проверить. Поэтому делать дополнительное увеличение индекса нужно не безусловно, а только если совпали условия для удвоения
+2
Карина
10 января 2022, 09:26
Вы говорите, что надо учесть условия, это понятно, а само удвоение синтаксически как обозначить? Ну как это буковками то написать то?))))
0
hidden #598481
10 января 2022, 10:57
Прикрепи свой актуальный код, посмотрим, в чём сложность.
В вопросе выше у автора был для этой проверки написан отдельный цикл с шагом i += 2, что неверно, надо проверять все элементы. И только в случае срабатывания проверки, внутри ифа, нужно сдвигать указатель на один элемент правее: i++
0
Ksenia VolkovaJava Developer в DXCMaster
10 января 2022, 11:14
Удвоение - это значит, надо добавить еще один такой же элемент рядом с уже существующим.
0
Карина
11 января 2022, 11:05
public static ArrayList<String> fix(ArrayList<String> strings) {
//напишите тут ваш код
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).contains("р") && strings.get(i).contains("л")) {
continue;
} else if (strings.get(i).contains("р") && !strings.get(i).contains("л")) {
strings.remove(strings.get(i));
} else if (strings.get(i).contains("л") && strings.get(i).contains("р")) {
strings.add(0, strings.get(i));
i++;// с этого момента не понимаю что делать, чтобы слово еще раз добавилось в ячейку и при этомпродублировалось, а не просто сдвинулось вперед
}
}
return strings;
}
}
0
Карина
11 января 2022, 11:06
Очень очень очень
прошу, помогите вникнуть в суть..)
0
Карина
11 января 2022, 11:07
Заглянула в готовое решение, там вообще блуд какой-то.... стало еще более не понятно((((
0
hidden #598481
11 января 2022, 11:45
У тебя число i - это указатель на текущую позицию, которую мы сейчас проверяем. После каждой итерации цикла оно увеличивается на 1, пока не достигнет величины list.size().
Чтобы задублировать элемент, его нужно вставить не в начало списка, а на текущую позицию. При этом все остальные элементы сдвинутся на один вправо, то есть проверяемый элемент станет следующим. Чтобы не проверять его еще раз, надо передвинуть указатель на него, то есть увеличить на один.
Подумай, что происходит со списком, когда ты производишь удаление из списка. Как нужно изменить величину i при удалении.
0
Карина
11 января 2022, 12:32
Если я удаляю элемент из списка, то следующий за ним элемент смещается на его место, а следующий за смещенным в свою очередь тоже смещается на место предыдущего . Верно?
0
Карина
11 января 2022, 12:49
А подскажите, пожалуйста по циклу for. Мы имеем список. 3 элемента. Но! емкость по умолчанию 10 насколько я поняла. Верно?
Итак, цикл идет по списку. Всего итераций сколько 3 или 10?
Что происходит в цикле?
1 итерация: слово РОЗА
1-й if не удовлетворяет условию - следующая инструкция
2-й if удовлетворяет условию - слово удалено \\ Что происходит после ? Переход на следующую итерацию или третья инструкция if? Смещение элементов после полного завершения трех инструкций?
0
Ksenia VolkovaJava Developer в DXCMaster
11 января 2022, 12:57
Цикл идет по списку, пока элементы в списке не закончатся.
Точнее, пока i будет меньше strings.size()
strings.size() - это актуальное количество элементов в списке.
2-й if удовлетворяет условию - слово удалено \\ Что происходит после ?
Элементы в списке смещаются сразу после удаления (в процессе удаления).
3-е условие проверяться не будет, потому что условия, стоящие после else проверяются только если не выполнилось предыдущее.
0
Карина
11 января 2022, 14:14
"...Подумай, что происходит со списком, когда ты производишь удаление из списка. Как нужно изменить величину i при удалении."
при удалении элементы смещаются.
величину i при удалении нужно сдвинуть в другую сторону на один пункт?
0
hidden #598481
11 января 2022, 14:23
да, правильно.
0
Карина
11 января 2022, 14:43
все равно не очень улавливаю
если смещаем после удаления в другую сторону, то записать надо так-------> i--; Что это означает, что мы как бы оставляем местечко(ячейку пустой?
0
Карина
11 января 2022, 14:46
Тогда вот, что получается: public static ArrayList<String> fix(ArrayList<String> strings) {
//напишите тут ваш код
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).contains("р") && strings.get(i).contains("л")) {
continue;
} else if (strings.get(i).contains("р") && !strings.get(i).contains("л")) {
strings.remove(strings.get(i));
i--;
} else if (strings.get(i).contains("л") && !strings.get(i).contains("р")) {
strings.add( 0,strings.get(i));
i++;
}
}
return strings;
}
}
Вывод в консоль: лоза
лоза
лоза
лира
Что является неверным((((((( должно быть
лира
лоза
лоза
0
Ksenia VolkovaJava Developer в DXCMaster
11 января 2022, 14:56
Потому что ты при удвоении вставляешь свой дубль в начало списка
0
hidden #598481
11 января 2022, 15:03
Чтобы знать, какой должен быть вывод, мне нужно знать, какой у тебя исходный список со словами, а я не знаю.
> все равно не очень улавливаю
если смещаем после удаления в другую сторону, то записать надо так-------> i--; Что это означает, что мы как бы оставляем местечко(ячейку пустой?
Разбирай пошагово.
Допустим, дан такой список
Ты создаешь цикл, в котором число i изначально равно нулю, и пока оно меньше размера списка, оно будет увеличиваться на 1 после каждой итерации цикла. Я специально делаю такой акцент на том, что написано в условии цикла, чтобы подчеркнуть, что число i не связано как-то напрямую с самим списком: это просто некоторое целое число, которое изменяется в границах от нуля до размера списка, а мы уже сами решаем использовать это число в качестве индекса элемента.
Итак, первое слово "арбуз", и его нужно удалить. i у нас равно 0.
Удалили слово, получился список:То есть первым словом у нас стал "руль", который мы еще не проверяли, и должны проверить только на следующей итерации цикла. А что произойдет с переменной i после завершения первого шага цикла? Оно увеличится на 1, т.к. это написано в условии цикла for. Таким образом мы пропустим слово "руль" и перейдём сразу к "лесу". Поэтому, чтобы компенсировать этот сдвиг всех слов при удалении элемента, нужно уменьшить i на 1.
Таким образом у нас сначала i из 0 станет -1 , а затем после первой итерации цикла увеличится снова до 0, только на нулевой позиции у нас уже будет следующее слово, не "арбуз", а "руль".
Ровно по той же причине при добавлении слова мы должны компенсировать сдвиг правой половинки списка, т.к. в противном случае мы на каждой следующей итерации будем проверять одно то же самое слово, которое проверили на предыдущей, ведь оно будет сдвигаться все правее при каждом добавлении. Только у тебя всё ещё ошибка, надо добавлять не в начало списка, а на текущую (i-тую) позицию.
+1
hidden #598481
11 января 2022, 15:06
У задачи есть другой подход к решению, в котором нет этих костылей с индексом. Подумай, как ещё можно перебирать список.
0
Карина
12 января 2022, 12:32
Боже мой!!!!! Я готова расцеловать Вас!!!!!))))))) Одна ваша фраза поставила в моей голове все по местам! Вот эта фраза изменила все: Таким образом мы пропустим слово "руль" и перейдём сразу к "лесу".
Спасибо огромное за вашу отзывчивость, вы прирожденный педагог.
+1
Карина
12 января 2022, 12:34
Ну я пока знаю только for i и for each. for each или мимо? Но в данном случае мне его польза не очевидна.
В одной умной книжке читала про один интерфейс Iterator<Е> iterator(). На сколько я поняла он-таки для перебора коллекции...направление мысли верно?))
0
hidden #598481
12 января 2022, 13:26
Спасибо за отзыв, очень приятно.
Форич сразу нет, потому что в нем наоборот нельзя модифицировать перебираемую коллекцию. Даже создан специальный тип исключения - ConcurrentModificationException - который возникнет, если в процессе перебора коллекции циклом форич в неё что-то добавить или удалить.
На самом деле всё намного проще. Если посмотреть внимательно, то все наши сдвиги затрагивают только правую половину списка, начиная с текущего элемента: все проверенные на предыдущих шагах элементы уже остановлены окончательно на своих местах: какие надо удалены, какие надо удвоены. Поэтому можно просто перебирать список в обратном направлении, и тогда можно удалять и добавлять сколько угодно, следующие элементы будут не затронуты:
i = 2, strings.get(i) - "лес"
добавляем "лес", i--
i = 1, strings.get(i) - "руль"
оставляем "руль", i--
i = 0, strings.get(i) - "арбуз"
удаляем "арбуз", i--
i = -1, цикл прерывается
+1
Карина
12 января 2022, 18:12
Да, точно! Очень интересно. Я вам очень и очень признательна за такое полезное пояснение.
Подскажите, а все-таки Итератор вообще используется в подобных вещах?
Видите ли в чем дело, когда я изучаю тему и читаю, что мол есть такие то методы, которые возвращают то-то и то-то, этих знаний часто бывает мадо, т.к. мне не очевидно прикладное значение того или иного метода. И раз уж зашла речь, то может быть вы сможете прояснить этот вопрос с Итератором ))
0
Кирилл
28 апреля 2022, 16:20
ДаДаДа!!! Этот человек умеет подобрать нужные слова!!!!Мне он тоже ни один раз помог!!!
+1
Кирилл
28 апреля 2022, 16:31
Спасибо тебе добрый человек!!! Как всегда выручил своими объяснениями!!! А то уже хотелось монитор разбить....!!!!
+1
Natalie Java Developer
2 мая 2022, 09:42
присоединяюсь к благодарностям, Вы очень доходчиво всё объяснили :)
+1