Читать словарь (txt-файл) в следующем формате: слово или выражение|перевод. Затем приложение должно прочитать файл для перевода и перевести его по следующим правилам:
- игнорировать регистр
- если искомое слово нет в словаре, то печатает без перевода.
- если есть несколько подходящих вариантов, выбирается вариант с максимальной длиной левой части, т.е. если в словаре есть переводы "посмотри" " и "с нетерпением жду", то наиболее подходящим вариантом должен быть выбрано
Создание и применение пользовательских исключений:
• InvalidFileFormatException
• FileFileReadException когда файл не существует, нет доступа к файлу и т. д.
Мой код:
Код: Выделить всё
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
public class Translator {
public Map getDictionary(String filePath) throws IOException, InvalidFileFormatException {
Map dictionary = new HashMap();
try (BufferedReader br = Files.newBufferedReader(Paths.get(filePath))) {
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split("\\|");
if (parts.length != 2) {
throw new InvalidFileFormatException("Invalid format file: " + line);
}
dictionary.put(parts[0].trim(), parts[1].trim());
}
}
return dictionary;
}
public String translateText(String textFile, Map dictionary) throws FileReadException, IOException {
StringBuilder result = new StringBuilder();
try (BufferedReader br = Files.newBufferedReader(Paths.get(textFile))) {
String line;
while ((line = br.readLine()) != null) {
String[] words = line.split("\\s+");
for (String word : words) {
result.append(translateWord(word, dictionary)).append(" ");
}
}
} catch (FileNotFoundException e) {
throw new FileReadException("File was not found: " + textFile);
}
return result.toString().trim();
}
private String translateWord(String word, Map dictionary) {
String cleanedWord = word.replaceAll("[^a-zA-Zа-яА-Я]", "");
String translatedWord = cleanedWord;
int maxMatchLength = 0;
for (String key : dictionary.keySet()) {
if (cleanedWord.equalsIgnoreCase(key)) {
translatedWord = dictionary.get(key);
break;
}
if (cleanedWord.toLowerCase().startsWith(key.toLowerCase())) {
if (key.length() > maxMatchLength) {
translatedWord = dictionary.get(key);
maxMatchLength = key.length();
}
}
}
return word.replaceAll(cleanedWord, translatedWord);
}
}
Код: Выделить всё
public class Application {
private static final String FILE_PATH = "src/main/java/lab_2/dictionary.txt";
private static final String INPUT_FILE = "src/main/java/lab_2/text_for_translate.txt";
public static void main(String[] args) {
Translator translator = new Translator();
try {
Map dictionary = translator.getDictionary(FILE_PATH);
String translatedText = translator.translateText(INPUT_FILE, dictionary);
System.out.println("Translated text:\n" + translatedText);
} catch (IOException e) {
System.err.println("Error while reading file: " + e.getMessage());
} catch (InvalidFileFormatException e) {
System.err.println("Invalid file format: " + e.getMessage());
} catch (FileReadException e) {
System.err.println("Unable to read file: " + e.getMessage());
}
}
}
Код: Выделить всё
look|translation1
look forward to|translation2
Код: Выделить всё
I look forward to our meeting.Итак, требуется первый перевод, но я ожидаю второго, потому что с нетерпением жду. Я предполагаю, что это из-за разделения String[]words = line.split("\\s+");.
Как исправить подобные ошибки?
Подробнее здесь: https://stackoverflow.com/questions/793 ... some-rules
Мобильная версия