Удалить все повторяющиеся строки из массива
Задание: считать с клавиатуры 6 строк и заполнить ими массив strings. Если есть одинаковые строки, то удалить их.
Пример:
Массив после чтения строк:
{"Hello", "Hello", "World", "Java", "Tasks", "World"}
Массив после удаления повторяющихся строк:
{null, null, null, "Java", "Tasks", null}
Вопрос заключается в том, что тестирующая система не принимает решения, а я не могу понять почему. Думал, проблема может быть в выводе, поэтому заменил вывод следующим куском кода, который был в системе, но не помогло:
// Вывод
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + ", ");
}
Вот мой основной код:
package helloworld;
import java.util.Scanner;
public class HelloWorld {
public static String[] strings; // Объявляем массив
public static void main(String[] args) {
Scanner console = new Scanner(System.in); // Объект класса Scanner
int arrLen = 6;
strings = new String[arrLen];
// Заполнение массива
for (int i = 0; i < arrLen; i++) {
strings[i] = console.nextLine();
}
// Обработка массивов
for (int i = 0; i < arrLen; i++) {
for (int j = 0; j < arrLen; j++) {
/*
Сравниваем элемент массива с другими элементами, когда индексы элементов неравны
(то есть не сравниваем элемент с самим собой)
*/
if (i != j && strings[i] != null) {
if (strings[i].equals(strings[j])) {
strings[i] = null;
strings[j] = null;
}
}
}
}
// Вывод
for (int i = 0; i < arrLen; i++) {
System.out.println(strings[i]);
}
}
}
Ответы (4 шт):
Тебе нужно все-таки сделать между for циклами временную переменную String current = strings[i]; и сравнивать с ней, то есть не
strings[i].equals(strings[j])
а
current.equals(strings[j])
Для того, чтоб не потерять третью одинаковую переменную, если она есть. Ведь если ты сажаешь на null оба элемента
strings[i] = null;
strings[j] = null;
то тебе тупо будет не с чем дальше сравнивать и не получится найти третий эелемент. А так ты продолжаешь сравнивать с current
Во временную переменную надо класть значение, например так
String current = String.valueOf(strings[i]);
Иначе, если удалить strings[i], то current тоже будет null.
Это задание с Javarush. Если кому интересно вот решение, на которое потратил не мало сил и так.
/*
Удаляем одинаковые строки
*/
public class ArrayString {
public static String[] strings;
// Удаляем одинаковые строки
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
strings = new String[6]; // назначаем массив из 6 блоков
for (int i = 0; i < strings.length; i++) {
strings[i] = scanner.nextLine(); // запись в массив
}
for (int i = 0; i < strings.length; i++) {
String str = strings[i]; // дополнительная переменная
for (int j = i + 1; j < strings.length; j++) {
if (str == null)
break;
if (str.equals(strings[j])) { // сравнение текста
strings[i] = null; // в массиве
strings[j] = null;
}
}
}
for (String string : strings) System.out.print(string + ", ");
}
}
Застревал на этой задачке конкретно, все таки циклы внутри циклов трудновато осознать. В итоге решил через создание второго такого же массива, и без создания временной переменной для хранения значений. Конечно, пришлось гуглить как создать дубль массива. Варианта было 2, либо через цикл, либо с помощью готового инструмента. Выбрал готовый.
import java.util.Scanner;
public class Solution {
public static String[] strings;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
strings = new String[6];
String[] array = new String[strings.length];
for (int i = 0; i < strings.length; i++) {
strings[i] = sc.nextLine(); // заполняем оригинальный массив
}
System.arraycopy(strings, 0, array, 0, strings.length);// делаем дубль оригинального массива
for (int i = 0; i < strings.length; i++) {
for (int j = 0; j < strings.length; j++) {
if (j != i) { // если индексы элементов двух массивов разные,
if (array[j].equals(strings[i])) { // то сравниваем их значения. Если значения одинаковы,то
strings[i] = null; // устанавливаем значение оригинального массива = null.
break; // прерываем вложенный цикл.
}
}
}
}
for (int i = 0; i < strings.length; i++) {
System.out.print(strings[i] + ", ");
}
}
}