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

时间:2020-08-03 01:57:56

标签: java replaceall

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

我想知道是否可以优化此行?

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 个答案:

答案 0 :(得分:1)

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

对于初学者来说,replaceAll确实做得更好('replace是一个愚蠢的名称;第一个参数是正则表达式。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); ,也没有全部, 替换掉所有内容,并采用一个实际的原始字符串,这正是您想要的-Java不喜欢破坏向后兼容性;愚蠢的名称不太可能得到纠正)。

第二,“较短”大部分是没有意义的。编写代码的相关目标是可读性和灵活性,很少是效率(性能);矮个子本身并不是一个相关的目标。

这是另一种选择。对于大型字符串,它的效率明显更高。对于小字符串,这是2020年,所需时间将舍入为0。

{{1}}

答案 1 :(得分:1)

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