Заменить один набор символов другим набором символов - PullRequest
0 голосов
/ 03 августа 2020

Я пишу код для преобразования римских чисел в десятичные числа.

Мне было интересно, можно ли оптимизировать эту строку?

String s = "MCMXCIV";
String code = s.replaceAll("I", "a")
               .replaceAll("V", "b")
               .replaceAll("X", "c")
               .replaceAll("L", "d")
               .replaceAll("C", "e")
               .replaceAll("D", "f")
               .replaceAll("M", "g");

Ожидаемое значение code: gegceab

РЕДАКТИРОВАТЬ 1 : Можно ли тот же код записать более коротким способом?

ИЗМЕНИТЬ 2 :

Два условия Я хочу

  1. Избегать дорогостоящей конкатенации строк
  2. заменять каждый символ соответствующим кодом в O(1)

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы можете использовать два массива и l oop через них, заменив from[i] на to[i].

String s = "MCMXCIV";
char[] from = new char[]{'I', 'V', 'X', 'L', 'C', 'D', 'M'};
char[] to = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g'};

for (int i = 0; i < from.length; i++){
    s = s.replace(from[i], to[i]);
}
1 голос
/ 03 августа 2020

Я понятия не имею, как это помогает вам переводить римские числа в десятичные, но, конечно, это можно упростить!

Для начала, .replace выполняет эту работу намного лучше ('replaceAll - это глупое имя; первый аргумент - регулярное выражение. replace без всего, также заменяет все и принимает фактическую необработанную строку, что вы хотели - java не нравится нарушение обратной совместимости; глупое название вряд ли будет исправлено).

Во-вторых, «короче» в большинстве случаев бессмысленно. Важными целями при написании кода являются удобочитаемость и гибкость и редко эффективность (производительность); короче само по себе не имеет отношения к цели.

Вот альтернативный вариант; это значительно эффективнее для больших струн. Для маленьких струн это 2020 год, затраченное время округляется до 0.

private static final String LETTERS = "IVXLCDM";

char[] cs = s.toCharArray();
for (int i = 0; i < cs.length; i++) {
    cs[i] = 'a' + LETTERS.indexOf(cs[i]);
}
String code = new String(cs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...