метод Split с сохранением знаков препинания
есть такая задача: Дан текст, состоящий из предложений. Необходимо пронумеровать предложения в тексте, приписав номер предложения в конце предложения (после знака окончания предложения) в квадратных скобках. Пример: "Мама мыла раму. Вовочка валял дурака..." –> "Мама мыла раму.[1] Вовочка валял дурака.[2].."
String str=null;
try{
BufferedReader br=new BufferedReader(new FileReader("1.txt"));
while((str=br.readLine())!=null){
for(int i=0; i<str.length(); i++){
for(int i=0; i<sr.length(); i++){
String[] word=sr.split("[.?!]");
System.out.print(word[i]+"["+(i+1)+"]");
}
}
}
} catch (Exception e){
System.out.print("Error");
}
В данном случае вывод такой: мама мыла раму[1] вовочка валял дурака[2]Error. Что нужно поменять или добавить, чтобы вывод происходил со знаками препинания? Ещё в самом конце выскакивает "Error". я как то не правильно использую try catch или ошибка в коде? И, если текст начинается с новой строки, он его не видит, как это исправить?
Ответы (1 шт):
Во-первых, вам не кажется, что цикл, вложенный в цикл, вложенный в цикл - это перебор? Во-вторых, зачем вы используете BufferedReader + FileReader для чтения файлов, если есть более простые способы это сделать? В-третьих, вы не думали о том, что сплит в данном случае не совсем удобен и рационален?
Для начала давайте отделим чтение файла от логики и выполним это самое чтение чем-то поудобнее, чем BufferedReader + FileReader. После этого, когда мы имеем не файл, а переменную типа String с нужным нам текстом, создадим метод, который будет принимать исходный текст, хранящийся в переменной String и вернет текст с уже подсчитанными предложениями. Чтобы не создавать дополнительных объектов используем StringBuilder. Переменная String инкапсулирует в себе массив char, это значит что пройти циклом по этому массиву, доставая каждый char по его индексу, не составит труда. Осталось только сравнить текущий чар с точкой и добавить информавцию о номере предложения. Думаю, что эта реализация максимально простая и понятная
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
private final static String FILE_NAME = "1.txt";
public static void main(String[] args) throws IOException {
try (Stream<String> stream = Files.lines(Paths.get(FILE_NAME))) {
String text = stream.collect(Collectors.joining("\n"));
String result = check(text);
System.out.println(result);
}
}
private static String check(String line) {
StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = 0; i < line.length(); i++) {
sb.append(line.charAt(i));
if (line.charAt(i) == '.' && line.charAt(i - 1) != '.') sb.append("[").append(++count).append("]");
}
return sb.toString();
}
}