Прочитать файл и перевести по некоторым правиламJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Прочитать файл и перевести по некоторым правилам

Сообщение Anonymous »

Задача:
Читать словарь (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.
он печатает I Translation1 жду нашей встречи.
Итак, требуется первый перевод, но я ожидаю второго, потому что с нетерпением жду. Я предполагаю, что это из-за разделения String[]words = line.split("\\s+");.
Как исправить подобные ошибки?

Подробнее здесь: https://stackoverflow.com/questions/793 ... some-rules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»