Удаление слова внутри текстового файла

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


public class Main11 {

    public static void main(String[] args) {

        Scanner s=new Scanner (System.in);

        System.out.println("<Source file> <Words to filter>");

        String st1=s.nextLine();

        String [] split1=st1.split(" ");

        Path p = Paths.get(split1[0]);


        try {

            List<String> lines=Files.readAllLines(p, StandardCharsets.UTF_8);
            List<String> filter = lines;


            for(int i=0;i<lines.size();i++) {

                for(int j=0;j<split1.length;j++) {



                    final int x=j;

                    filter=filter.stream().filter(line-> !line.contains(split1[x])).collect(Collectors.toList());

                }
            }

            BufferedWriter writer = Files.newBufferedWriter(p);

            for(int c=0;c<filter.size();c++) {
                writer.write("\n" + filter.get(c));
            }

            writer.close();

            System.out.println("Done");

        } catch (IOException e) {

            System.out.println("file not found");
        }

        s.close();

    }

}

Найдите «строки токенизации Java» с помощью вашего любимого веб-поиска.

clvrmnky 17.05.2022 19:54
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
1
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш код фильтрует, просматривая строку за раз и фильтруя, если он включает слово. Если да, то функция возвращает false и строка не попадает в список. Вам нужен еще один уровень зацикливания в функции фильтра, который разбивает строку на отдельные слова, а не рассматривает ее как единое целое. Вам нужно использовать String.split для строки, чтобы разделить ее на слова, а затем отфильтровать массив, возвращаемый Stirng.split, чтобы увидеть, равно ли каждое слово целевому слову.

Извините, я не совсем понял, какой список мне следует разделить. Я попытался разбить фильтр списка, но я не могу использовать для него функцию .split.

jhonprog 17.05.2022 12:24
Ответ принят как подходящий

Возможно, вы могли бы сохранить слова для фильтрации в Set:

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter: <source-file> <words-to-filter>");
        String input = scanner.nextLine();
        String[] inputSplit = input.split(" ");
        String sourceFile = inputSplit[0];
        Path p = Paths.get(sourceFile);
        Set<String> wordsToFilter = Set.of(Arrays.copyOfRange(inputSplit, 1, inputSplit.length));
        try {
            List<String> lines = Files.readAllLines(p, StandardCharsets.UTF_8);
            List<String> filteredLines = new ArrayList<>(lines.size());
            for (String line : lines) {
                filteredLines.add(Arrays.stream(line.split(" "))
                    .filter(word -> !wordsToFilter.contains(word))
                    .collect(Collectors.joining(" ")));
            }
            BufferedWriter writer = Files.newBufferedWriter(p);
            for (String filteredLine : filteredLines) {
                if (!filteredLine.isEmpty()) {
                    writer.write(filteredLine + "\n");
                }
            }
            writer.close();
            System.out.println("Done filtering!");
        } catch (IOException e) {
            System.err.println("Error: file not found");
        }
    }

}

Пример использования:

Enter: <source-file> <words-to-filter>
/Users/shash/Desktop/file.txt a c
Done filtering!

file.txt до:

a a a
a a a b a c d a
b b b d e r

file.txt после:

b d
b b b d e r

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