Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
2 / 2 / 2
Регистрация: 20.10.2016
Сообщений: 130

Удалить все слова, содержащие от трех до пяти символов

12.12.2017, 19:13. Показов 8337. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Из файла удалить все слова, содержащие от трех до пяти символов, но при этом из каждой строки должно быть удалено только максимальное четное количество таких слов.

С задачей почти справился, но корректно программа работает только если в файле в конце строк строит пробел, подскажите, как это исправить?


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.io.*; 
import java.io.File;
 
public class Lab7 {
    
    public static int BadWordCounter (String line) {
        int count = 0, BadWordCountFirst = 0;
        for (int i = 0; i < line.length(); i++) {
            if (line.charAt(i) != ' ') {
                count++;
            }
            else if (count >= 3 && count <= 5) {
                BadWordCountFirst++;
                count = 0;
            }
            else
                count = 0;
        }
        if (BadWordCountFirst % 2 == 0)
            return BadWordCountFirst;
        else
            BadWordCountFirst--;
        return BadWordCountFirst;
    }
    
    public static void main(String[] args) {
        int i,count = 0, BadWordStart = 0, BadWordCountSecond = 0;
        try {
            File sourceFile = new File("C:/Users/EDWIN/Desktop/Lab7/file.txt");
            File outputFile = new File("C:/Users/EDWIN/Desktop/Lab7/file2.txt");
            BufferedReader reader = new BufferedReader(new FileReader(sourceFile));
            BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
            // считаем сначала первую строку
            String line = reader.readLine();
            String tmp = "", tmpline = "";
            while (line != null) {
                    tmpline = line;
                    for (i = 0; i < line.length(); i++) {
                        if (line.charAt(i) != ' ') {
                            count++;
                        }
                        else if (count >= 3 && count <= 5) {
                                if (BadWordCountSecond == BadWordCounter(line))
                                    break;
                                BadWordCountSecond++;
                                System.out.println(BadWordCountSecond);
                                BadWordStart = i - count;
                                for (int g = BadWordStart; g <= i; g++) {
                                    tmp = tmp + String.valueOf(line.charAt(g));
                                }
                                    tmpline = tmpline.replaceFirst(tmp, "");
                                tmp = "";
                                count = 0;
                        }
                        else
                            count = 0;
                    }
                System.out.println("");
                System.out.println(tmpline);
                BadWordCountSecond = 0;
                BadWordStart = 0;
                count = 0;
                 if (!tmpline.equals(line)) {
                     writer.write(tmpline);
                     writer.newLine();
                 }
                 line = reader.readLine();
                
            }
            reader.close();
            writer.close();
            sourceFile.delete();
            outputFile.renameTo(sourceFile);
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}

насколько я понимаю эта ошибка возникает из-за того что я проверяю только на пробелы, может мне стоит добавить проверку на конец строки вот сюда
Java
1
2
3
4
                    for (i = 0; i < line.length(); i++) {
                        if (line.charAt(i) != ' ') {
                            count++;
                        }
if (line != null) вроде бы не подойдет, потому что выше стоит цикл с условием while (line != null), как мне добавить проверку на конец строки?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.12.2017, 19:13
Ответы с готовыми решениями:

Из файла удалить все слова, содержащие от трех до пяти символов, но из строки максимальное четное количество слов
Из файла удалить все слова, содержащие от трех до пяти символов, но при этом из каждой строки должно быть удалено только максимальное...

Удалить слова, содержащие все повторяющиеся буквы первого слова, из последовательности символов
Дана последовательность символов, состоящая из слов. Удалить слова, которые содержат все повторяющиеся буквы первого слова, с сохранением...

Удалить из массива все слова, содержащие не меньше трех четных цифр
Дан массив из n слов произвольной длины (длина слова не превышает 80 символов) . Элементами слов могут быть любые графические символы....

5
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
12.12.2017, 20:32
Цитата Сообщение от EDWIN503 Посмотреть сообщение
но при этом из каждой строки должно быть удалено только максимальное четное количество таких слов
Что подразумевается этой записью? Не понимаю
0
2 / 2 / 2
Регистрация: 20.10.2016
Сообщений: 130
12.12.2017, 20:38  [ТС]
ArtemFM,
К примеру строка:

22 334 5554 333

Удалит только числа 334 и 5554, хотя так называемых "Плохих" слов, то есть неподходящих нам, было 3, но максимальное четное = 2

Добавлено через 1 минуту
ArtemFM, Для этого и нужна функция BadWordCounter (), она считает количество плохих слов в стоке, и, если оно четное, возвращает его, а если нечетное то отнимает 1 и возвращает
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
12.12.2017, 20:40
Понял, но я бы твою программу сделал немного по другому, т.к. к примеру 123,234,345 - это 3 слова разделённых запятой
я бы:
1. прочитал файл в коллекцию Лист
2. каждую строку бы обработал и добавил в новый лист
3. записал лист.

Могу накидать код, если хочешь?
А конец строки - это или \\d или \n
0
2 / 2 / 2
Регистрация: 20.10.2016
Сообщений: 130
12.12.2017, 20:44  [ТС]
ArtemFM, Было бы неплохо, спасибо
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
12.12.2017, 21:48
Лучший ответ Сообщение было отмечено EDWIN503 как решение

Решение

Хорошо, накидаю, через часик будет готова

Добавлено через 1 час 2 минуты
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
 
public class Task013 {
    public static void main(String[] args) {
        String path = "C:\\fin.txt";
        String save = "C:\\result.txt";
 
        int minSymbols = 3;
        int maxSymbols = 5;
 
        //читаем файл в коллекцию
        List<String> textList = readFile(path);
 
        //выводим начальный текст
        System.out.println("Текст:\n");
        textList.forEach(System.out::println);
 
        //разделение между текстом
        System.out.println("\n#################################################################################\n");
 
        textList = deleteBadWordsToCollection(textList, minSymbols, maxSymbols);
 
        //выводим конечный текст
        System.out.println("Текст в результате:\n");
        textList.forEach(System.out::println);
 
        //сохраняем данные в файл
        saveToFile(save, textList);
    }
 
    /**
     * Сохраняем данные в файл.
     *
     * @param path - путь для создания файла и сохранения в него;
     * @param list - то, что запишем в файл (коллекция)
     */
    public static void saveToFile(String path, List<String> list) {
        try {
            Files.write(Paths.get(path), list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * Читаем файл в коллекцию List<String> по пути path.
     *
     * @param path - путь к файлу;
     * @return коллекцию с данными из файла;
     */
    public static List<String> readFile(String path) {
        List<String> list = null;
        try {
            list = Files.readAllLines(Paths.get(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
 
    /**
     * Метод получает кол-во слов в строке по параметрам.
     *
     * @param line       - строка для поиска слов;
     * @param minSymbols - минимальное кол-во символов в слове включительно;
     * @param maxSymbols - максимальное кол-во символов в слове включительно;
     * @return кол-во слов, удовлетворяющих параметрам;
     */
    public static int getCountBadWords(String line, int minSymbols, int maxSymbols) {
        int result = 0;
        if (line != null) {
            line = line.trim(); //удаляем пробелы в начале и конце строки
            if (line.length() != 0) {
                for (String word : line.split("\\s+")) { //делим строку на массив по пробелам
                    int length = word.length();
                    if (length >= minSymbols && length <= maxSymbols) {
                        result++;
                    }
                }
            }
        }
        return result;
    }
 
    /**
     * Метод возвращает новую коллекцию, без слов не удовлетворяющих требованию.
     *
     * @param list - коллекция данных для редоктирования;
     * @param minSymbols - минимальное кол-во символов в слове включительно;
     * @param maxSymbols - максимальное кол-во символов в слове включительно;
     * @return новую коллекцию с редактируемым текстом;
     */
    public static List<String> deleteBadWordsToCollection(List<String> list, int minSymbols, int maxSymbols) {
        List<String> resultList = new ArrayList<>();
        if (list != null && !list.isEmpty()) {
            for (String line : list) {
                line = line.trim();
                int countWords = getCountBadWords(line, minSymbols, maxSymbols);
                line = deleteBadWords(line, countWords, minSymbols, maxSymbols);
                resultList.add(line);
            }
        }
        return resultList;
    }
 
    /**
     * Удаляем из строки "плохие" слова.
     *
     * @param line - строка для удаления в ней слов;
     * @param countBadWords - кол-во для удаления слов;
     * @param minSymbols - минимальное кол-во символов в слове включительно;
     * @param maxSymbols - максимальное кол-во символов в слове включительно;
     * @return строку без "плохих" слов;
     */
    public static String deleteBadWords(String line, int countBadWords, int minSymbols, int maxSymbols) {
        StringBuilder sb = new StringBuilder();
        if (line.length() != 0) {
            if (countBadWords > 0) {
                if (countBadWords % 2 != 0) {
                    countBadWords--;
                }
                for (String word : line.split(" ")) {
                    if (word.length() != 0) {
                        if (countBadWords != 0 && word.length() >= minSymbols && word.length() <= maxSymbols) {
                            countBadWords--;
                        } else {
                            sb.append(word).append(" ");
                        }
                    } else {
                        sb.append(" ");
                    }
                }
            }
        }
        return sb.length() == 0 ? line : sb.toString();
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2017, 21:48
Помогаю со студенческими работами здесь

Удалить из массива все слова, содержащие не меньше трех четных цифр
Добрый день. Имеется вот такая задача: Собственно, интересует проверка символов каждой строки. Делал так: for i:=1 to n do...

Удалить из массива все слова, содержащие не меньше трех четных цифр
Дан массив из n слов произвольной длины. Элементами слов могут быть любые символы. Удалить из массива все слова, содержащие не меньше трех...

Удалить из строки все слова, длина которых меньше пяти символов
1. Вывести на экране строку, введенную пользователем, по диагонали. 2. Добавить в строку пробелы после знаков препинания, если они там...

Удалить из строки все слова, длина которых меньше пяти символов
Удалить из строки все слова, длина которых меньше пяти символов. В строке не используются знаки препинания.

Удалить из строки все слова, длина которых меньше пяти символов
Удалить из строки все слова,длина которых меньше пяти символов.В строке не используются знаки препинания. решите пожалуйста,за ранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru