Не смогла решить задачу и посмотрела правильное решение. Объясните, пожалуйста, зачем тут вводится новая переменная currentString.
Что дает выражение - String currentString = strings[i]; В переменную сохраняется массив или первое значение массива?
Почему мы не можем просто сравнить циклы с i и j по очереди? И если они равны, то присваивать null.
Вот так:
public class Solution {
public static String[] strings;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
strings = new String[6];
for (int i = 0; i < 6; i++){
strings[i] = scanner.nextLine();}
for (int i = 0; i < strings.length; i++) {
for (int j = i + 1; j < strings.length; j++) {
if ((strings[i].equals(strings[j])) {
strings[j] = null;
strings[i] = null;
}
}
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + ", ");
}
}
}
А это правильное решение:
package com.javarush.task.pro.task05.task0508;
import java.util.Scanner;
/*
Удаляем одинаковые строки
*/
public class Solution {
public static String[] strings;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
strings = new String[6];
for (int i = 0; i < 6; i++) {
strings[i] = scanner.nextLine();
}
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;
}
}
}
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + ", ");
}
}
}
и еще вот это тоже не очень понятно...
if (currentString == null) {
break;
Спасибо большое заранее!!
Anonymous #2854449
18 уровень
Ребята, помогите, пожалуйста, понять код
Обсуждается
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Антон Власов
2 февраля 2022, 16:34
ваше решение не учитывает такой ситуации: предположим у вас в массиве три одинаковых строки - (str, der, str, ver, kul, str) две из них будут в результате сравнения null, а как тогда найти третью? ведь она тоже должна быть уничтожена) для этого и вводится образец (копия), чтобы была возможность выявить сколько угодно повторений
0
Антон Власов
2 февраля 2022, 16:28
if (currentString == null) {
break;
может так случиться, что при проходе по значениям массива в currentString будет передано значение null, какой смысл проверять это значение на равенство с другими значениями - никакого) - выходим, а т.к. мы налету меняем значения строк на null, то по мере работы алгоритма currentString все чаще будет null, а значит прерывая цикл мы сильно ускорим работу
0
Anonymous #2854449
2 февраля 2022, 20:16
Антон, спасибо Вам!!! Все теперь ясно!
0
FutureDevJava Student в Home Corporation ®
2 февраля 2022, 14:02
У нас есть массив
Если сравнивать строки просто между собой, то они будут убираться попарно. Т.е. как только будет (strings[i] == strings[j]), они обе станут null.
Получим картину:
В чем причина такой работы кода? В том, что строка strings[i], с которой мы хотим сравнивать все остальные, при каждом (strings[i] == strings[j]) сама становится null.
Это плохо. У нас пропадает объект, с которым мы собственно и хотим проводить сравнение. И третью "A" нам попросту нет с чем сравнивать...
Как нам этого избежать? Создать копию строки strings[i]. Назовем её currentString. Это будет наш образец, с которым мы будем сравнивать остальные строки.
Так при каждом (strings[i] == strings[j]) наша strings[i] по-прежнему будет становиться null, но currentString не будет изменяться, что позволит продолжить сравнение и в конечном итоге получить
+2
Anonymous #2854449
2 февраля 2022, 20:15
спасибо большое!!! все поняла!!!
0