Как удалить повторяющиеся слова из текстового файла с помощью java

У меня есть входной файл, например

имена.txt

   Maria Derek Erica
   Livia Jack Anita
   Kendall Maria Livia Derek
   Jamie Jack
   Thomson Erica

Я хочу вывести как. Удаление повторяющихся слов из имени

вывод.txt

   Maria Derek Erica
   Livia Jack Anita
   Kendall 
   Jamie 
   Thomson

Я уже пытался прочитать файл, разделенный пробелами, а затем добавить их в ArrayList, после чего я потерял, что делать дальше, чтобы сгенерировать вывод.

import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;

public class duplicate {
   public static void main(String[] args) throws IOException {
      ArrayList<String> list = new ArrayList<String>();
      File file = new File("weather.txt");
      Scanner input = new Scanner(file); 
      String prev = input.next();
      int count = 0;
      while (input.hasNext()) {
         String next  = input.next();
         System.out.println(next);
         set.add(next);
         count = count + 1;
         if (prev.equals(next))
         {
            System.out.println("Match found: -" + prev);
         }
         prev = next;
      } 

      System.out.println(list);
      System.out.println("Word count: " + count);
   }
}

Ваш ввод и вывод в приведенном вами примере противоречивы. Если есть дубликаты, какой из них следует сохранить? Первая, как у Марии, или последняя, ​​как у Эрики? Что должно произойти со строкой, в которой Только содержит повторяющееся имя? Я чувствую, что вам нужно, чтобы желаемая функциональность была более четко определена здесь, прежде чем пытаться обратиться к механике того, как ее выполнить.

Jordan 30.05.2019 17:28

Извините, я исправил это

Atik Rahman 30.05.2019 17:31

Почему имя Эрика полностью исчезло из вывода?

jeremye 30.05.2019 17:33

@illiteratecoder, лол, может быть, это имя его бывшей

Tyulpan Tyulpan 30.05.2019 17:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
2 213
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если порядок не имеет значения, просто используйте Задавать. Set автоматически отфильтрует повторяющийся элемент. Затем просто распечатайте этот набор. У тебя все будет отлично.

Set<String> list = new HashSet<String>();

Я пытался, но мне не удалось использовать set. Существуют ли какие-либо требования к версии для set ?

Atik Rahman 30.05.2019 17:33

Вы даже можете сохранить набор для создания заказа как:

Set<String> uniqueNames = new LinkedHashSet<>();

Затем вы можете просто добавить элементы в свой набор:

uniqueNames.add(next);
import java.util.Scanner;
import java.io.*;
import java.util.HashSet;

public class Duplicate {
    public static void main(String[] args) throws IOException {
        HashSet<String> lines = new HashSet<String>();
        File file = new File("weather.txt");
        Scanner input = new Scanner(file);
        int count = 0;
        while (input.hasNext()) {
            String next  = input.next();
            System.out.println(next);
            lines.add(next);
            count++;
        } 
        input.close();
        System.out.println(lines);
        System.out.println("Word count: " + count);
        System.out.println("Unique word count: " + lines.size());
    }
}
Ответ принят как подходящий

Вы захотите использовать Set или HashSet для отслеживания повторяющихся имен и ArrayList для хранения ваших конечных строк, которые будут записаны в выходной файл.

Поскольку мы вносим изменения построчно, нам нужно 1) прочитать файл построчно, 2) разделить строку для обработки отдельных имен, 3) отредактировать строку или создать новую результирующую строку по мере необходимости, и 4) затем сохраните отредактированную строку для вывода в конце:

import java.util.*;
import java.io.*;

public class Duplicate {
    public static void main(String[] args) throws IOException {
        HashSet<String> uniqueNames = new HashSet<String>();
        ArrayList<String> outputLines = new ArrayList<String>();

        Scanner input = new Scanner(new File("input.txt"));
        while (input.hasNextLine()) {

            // Split a line into an array of names.
            String[] names = input.nextLine().split(" ");
            String edited = "";
            for (int i = 0; i < names.length; i++) {

                // If the name is already in the set, remove it.
                if (uniqueNames.add(names[i])) {
                    edited += names[i] + " ";
                }
            }

            edited = edited.strip();  // remove excess whitespace

            // Add the final line to our output array.
            if (!edited.equals("")) {
                outputLines.add(edited);
            }
        }

        // Write the output array to a file.
        String outputFn = "output.txt";
        BufferedWriter output = new BufferedWriter(new FileWriter(outputFn));
        output.write(String.join("\n", outputLines));
        output.close();
        System.out.println("File '" + outputFn + "' created!");
    }
}

Я оставляю это как упражнение, если вы хотите добавить другие функции, такие как подсчет общего количества слов или уникальных слов, поскольку вопрос, похоже, в основном касался поведения удаления дубликатов.

1) вы сделали решение, мы здесь помогаем, а не решаем; 2) ваше решение плохое

Tyulpan Tyulpan 30.05.2019 18:20

@TyulpanTyulpan Я открыт для того, чтобы оба были правдой. Давайте рассмотрим их по одному: что, по вашему мнению, плохого в моем решении и как бы вы предложили его улучшить?

jeremye 30.05.2019 18:24

Вы знаете, что это безумная практика — использовать классы вместо интерфейсов для создания объектов? Вы знаете, что эту задачу можно решить в несколько строк вместо ваших 30, используя Java 8?

Tyulpan Tyulpan 30.05.2019 21:58

@TyulpanTyulpan Мне бы хотелось увидеть решение всего в нескольких строчках, звучит очень круто!

jeremye 31.05.2019 03:35

Другие вопросы по теме