Мне нужно написать функцию для перевода некоторых «специальных символов» в «неспециальные символы». Моя отправляющая система поддерживает всю кодировку UTF-8, но в моей целевой системе доступен только сокращенный поднабор. Поэтому у меня есть таблица сопоставления для перевода этих символов. Эта таблица сопоставления представляет собой простой текстовый файл, содержащий, например, такую запись:
D̂;D
Первый символ — это мой «специальный символ», который следует заменить символом после точки с запятой.
Я прочитал эту таблицу сопоставления в HashMap:
String line;
while((line = bufferedReader.readLine()) != null) {
characterMap.put(
line.substring(0, line.indexOf(";")),
line.substring(line.indexOf(";") + 1)
);
}
bufferedReader.close();
Это работает нормально. Затем я пытаюсь заменить символы:
String target = "";
for (Map.Entry<String, String> entry : characterMap.entrySet()) {
target = source.replace(entry.getKey(), entry.getValue());
}
Но эта замена не работает. target
содержит то же, что и source
Как я могу сделать такую функцию?
при запуске замены вы фактически не обновляетесь source
. Однако вы заменяете target. Таким образом, результатом цикла for будет то, что целью будет source
с последней выполненной заменой. Вместо этого вы можете назначить String target = source
и для каждой итерации выполнить target = target.replace(...)
Замените ;
на =
. Затем вы можете загрузить карту за один раз с помощью Properties::load
Я сравниваю источник и цель. Конечно я ожидал результата в цель.
И я шагнул через петлю. Карта обрабатывается правильно. Ключ и значение содержат правильную строку, которую следует заменить в источнике (и сохранить в цели).
Суть заключалась в том, что на каждой итерации вы начинаете с нового исходного кода, отбрасывая замены, выполненные на предыдущей итерации.
Ради интереса, является ли D̂
настоящим одиноким персонажем?
Вам следует продолжать обновлять результат (цель)
String target = source;
for (Map.Entry<String, String> entry : characterMap.entrySet()) {
target = target.replace(entry.getKey(), entry.getValue());
}
Большое спасибо! И извините за глупость... Конечно, цикл перезаписывает результаты на каждом этапе.
Вы пробовали пройти через свой код? Вы смотрели, что второй запуск вашего цикла дает результат первого?