Всем привет!
Так и не смог решить задачу, пошел в ответы, но к сожалению, яснее не стало. Оказалось, что я где-то недопонимаю принцип работы.
Вот готовый код:
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
strings = new String [] {"Hello","Hi","Go","SW","Go","Lfw","Cabbage","Carrot","Hi"};
for (int i = 0; i < strings.length; i++) {
String currentString = strings[i];
for (int j = i + 1; j < strings.length; j++) {
if (currentString == null) {
break;
}
if (currentString.equals(strings[j])) {
strings[j] = null;
strings[i] = null;
В нем мне непонятен принцип работы этой части:
Допустим, у нас есть массив: {"Hello", "Hi", "Go", "SW", "Go", "Lfw", "Cabbage", "Carrot", "Hi"}.
Первая итерация внешнего цикла:
i = 0
currentString = "Hello"
Внутренний цикл: j от 1 до 8
j = 1: сравниваем "Hello" и "Hi" - не равны.
j = 2: сравниваем "Hello" и "Go" - не равны.
...
j = 8: сравниваем "Hello" и "Hi" - не равны.
В итоге, "Hello" не имеет дубликатов, ничего не меняется.
P.S. Здесь пояснения дал чат GPT
Но насколько я понимаю из этой части:
for (int i = 0; i < strings.length; i++) {
String currentString = strings[i];
for (int j = i + 1; j < strings.length; j++) {
if (currentString == null) {
break;
}
if (currentString.equals(strings[j])) {
strings[j] = null;
strings[i] = null;
String currentString должен с каждым витком цикла также менять свое значения из массива, как он сохраняет одно значение, а после гонит весь следующий цикл для сравнения?
Я думал, сравнение идет по типу:
currentString = "Hello" сравнивает "Hi", после виток перескакивает и currentString становится Hi, j становится Go, и далее.
Сейчас вижу, что это не так, может кто-нибудь объяснить простыми словами, почему так?
Заранее благодарю!
Anonymous #3445931
14 уровень
Объясните, пожалуйста, логику работы циклов
Обсуждается
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Денис Enterprise Java Developer
6 июня 2024, 19:09
Слово может повторяться нечётное количество раз, например три, ну это по примеру. А вообще твой код работает, хотя я бы чуть иначе делал, например проверку current на нулл можно делать во внешнем цикле.
Сам по себе код работает просто как двери. В памяти лежат строки, на них есть ссылки, например они хранятся в массиве strings, тебе некоторые из них нужно сделать null, но вот беда, если ты сделаешь таковую нуллом, ее уже ни с чем нельзя сравнивать, у нулла нет возможности вызывать методы.
Для этого есть два обхода, или как в твоём случае дополнительная переменная, которая хранит в себе ссылку на объект и именно с ее помощью ты проводишь сравнения со всеми остальными ссылками в массиве, обнуляя все найденные, или можно завести булеву переменную, и во время нахождения дублей обнулять только дубль, проставив эту переменную в true, выйдя же из вложенного цикла, проверить значение буля и если оно тру - обнулить и строку в индексе внешнего цикла.
+2