用另一组字符替换一组字符

Replace one set of characters with another set of characters

我正在编写代码将罗马数字转换为十进制数字。

我想知道这条线路是否可以优化?

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)
  3. 中相应的代码替换每个字符

我不知道这如何帮助您将罗马数字转换为十进制数字,但是,当然,这可以简化!

对于初学者来说,.replace 确实做得更好('replaceAll 是一个愚蠢的名字;第一个参数是正则表达式。replace,没有 all,also 全部替换,并采用实际的原始字符串,这正是您想要的 – java 不喜欢破坏向后兼容性;愚蠢的名称不太可能得到更正)。

其次,'shorter'基本上没有意义。编写代码时的相关目标是可读性和灵活性,很少有效率(性能);更短本身并不是一个相关的目标。

这是另一种选择;对于大字符串,它的效率要高得多。对于小字符串,现在是 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);

您可以使用两个数组并循环遍历它们,将 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]);
}