По условиям задачи я понял, что если слова в массиве повторяются должно выводиться null, как решить не понимаю, поэтому посмотрел правильное решение и все равно не понял
for (int i = 0; i < strings.length; i++) { // здесь создаётся цикл и он выполняется пока i меньше длинны массива!? Правильно понял?
String currentString = strings[i]; // здесь создаётся новый стринг и присваивается слова из массива!? Не понимаю для чего это делать надо и для чего вообще цикл?
for (int j = i + 1; j < strings.length; j++) {// в этом цикле не понимаю для чего i+1
if (currentString == null) {
break;
}
if (currentString.equals(strings[j])) {
strings[j] = null;
strings[i] = null; //эти два условия я тоже не понял
Объясните пожалуйста по каждой строчке кода для чего они и как выполняются
Игорь
6 уровень
Помогите разобраться
Архивный
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Kanoiti
7 апреля 2021, 15:41
Попробую рассказать как я понял
У нас есть массив, например из слов:
Hello Way Pull Hello Yes Hi Goodbye Yes Hi No (10 слов)
мы сразу в голове прикидываем, что нам нужно будет сравнить каждое слово со словами из массива
поэтому мы делаем цикл раз:
for (int i = 0; i < strings.length; i++) - что бы пройти просто по массиву
и сразу понимаем что нам нужен будет еще один цикл внутри, который будет сравнивать одно слово с остальными
for (int j = i + 1; j < strings.length; j++)
но тут мы прибавляем в цикле в j=i+1, ведь нам не надо сравнивать первое слово с первым
Добавляем переменную что бы было с чем сравнивать,
String currentString = strings[i]
она будет оставаться неизменной до конца внутреннего цикла, то есть если даже мы найдем похожее слово и поменяем их массиве на null, currentString останется неизменной до конца одной итерации внешнего цикла
Остальные условия пока что не трогаем и запускаем программу
Мы стартуем с нулевого слова в внешнем цикле (Hello), теперь отбрасываем в уме этот цикл и остается только одно слово Hello, и нам надо найти его повторы, используя только внутренний цикл
как только программа доходит до 3-тьего слова и видит повтор, она сразу меняет их в массиве
if (currentString.equals(strings[j])) {
strings[j] = null;
strings[i] = null
и первое слово и повторное, но переменная currentString так и остается "Hello"
Потом цикл кончается и как только идет 2-е слово Way, нулевое и 3-тье значение уже null в нашем цикла, и так далее
как только цикл дойдет до значения null сработает часть кода
if (currentString == null) {
break;
}
и нас просто выкинет из внутреннего цикла и пойдет следующая итерация внешнего
Надеюсь хоть чем то помог, тоже долго сидел(
+2
Vitaliy Kang
4 апреля 2021, 12:14полезный
for (int i = 0; i < strings.length; i++) { // здесь создаётся цикл и он выполняется пока i меньше длинны массива!? Правильно понял? - Все верно
String currentString = strings[i]; // здесь создаётся новый стринг и присваивается слова из массива!? Не понимаю для чего это делать надо и для чего вообще цикл? - здесь создается переменная для удобства, можно использовать и strings[i] вместо нее
for (int j = i + 1; j < strings.length; j++) {// в этом цикле не понимаю для чего i+1 - для того, чтобы алгоритм не сравнил строку strings[i] сама с собой, мы делаем отступ на одну позицию, то есть сравниваем со следующим словом в массиве
if (currentString == null) { //если алгоритм доходит до элемента массива, который уже был удален алгоритмом, то он завершает исполнение цикла j и берет следующее значение в цикле i
break;
}
if (currentString.equals(strings[j])) { //если алгоритм устанавливает что строка strings[i] равна строке strings[j] - то удаляет ссылки приравнивая их к null.
strings[j] = null;
strings[i] = null;
+3
Игорь
4 апреля 2021, 20:01
Спасибо за ответ, стало яснее, но не понял:
-если "i+1" мы сравниваем со следующим словом, как в такой логике программа понимает, что, к примеру, первое и пятое слово одинаковые
-и if(currentString==null) как алгоритм удаляет элементы в массиве, ведь перед этим только цикл который сравнивает строки
0
Vitaliy Kang
5 апреля 2021, 10:37
-если "i+1" мы сравниваем со следующим словом, как в такой логике программа понимает, что, к примеру, первое и пятое слово одинаковые
Обрати внимание на то, что у нас используется не просто одиночный цикл for, а вложенный один в другой:
for(int i = 0; i < strings.length; i++){ <------ внешний цикл, назовем его цикл i
String currentString = strings[i];
for(int j = i+1; j < strings.length; j++){ <------- вложенный цикл, пусть будет цикл j
...
}
}
То есть мы имеем цикл j, вложенный в цикл i. Как такие циклы работают? Вначале выполняется первая итерация цикла i, и по ходу ее выполнения алгоритм натыкается на цикл j и приступает к его выполнению. i не увеличится на единицу и не перейдет к выполнению следующей итерации, пока не будет полностью выполнен цикл j. На второй итерации цикла i история с полным выполнением цикла j вновь повторится.
Я тут понаписал целую кучу трудноусваиваемых букв. Лучше всего будет поставить себе IntelliJ Idea и посмотреть на ютубе гайд, как пользоваться режимом дебага. В этом режиме ты сможешь наглядно посмотреть, как выполняется программа поэтапно. Лучше один раз увидеть, как говориться.
-и if(currentString==null) как алгоритм удаляет элементы в массиве, ведь перед этим только цикл который сравнивает строки
Не совсем.
if (currentString.equals(strings[j])) { //если алгоритм устанавливает что строка strings[i] равна строке strings[j] - то удаляет ссылки приравнивая их к null.
strings[j] = null;
strings[i] = null;
Вот здесь происходит удаление строк. Если присвоить переменной ссылочного типа, коей и является строка, значение null, то происходит ее удаление. Советую почитать статейки, или посмотреть видосики про примитивные и ссылочные типы переменных в Java.
0