Java 用更干净的字符串编码方式替换多个replaceAll

Java 用更干净的字符串编码方式替换多个replaceAll,java,android,Java,Android,我需要在一个字符串中执行多个replaceAll命令,我想知道是否有一种干净的方法来执行。目前情况如下: newString = oldString.replaceAll("α","a").replaceAll("β","b").replace("c","σ") /* This goes on for over 60 replacements*/; 你可以这样做。映射将包含映射,您所要做的就是循环映射并调用replace publicstaticvoidmain(字符串[]args){ //你

我需要在一个字符串中执行多个
replaceAll
命令,我想知道是否有一种干净的方法来执行。目前情况如下:

newString = oldString.replaceAll("α","a").replaceAll("β","b").replace("c","σ") /* This goes on for over 60 replacements*/;

你可以这样做。映射将包含映射,您所要做的就是循环映射并调用
replace

publicstaticvoidmain(字符串[]args){
//你的意见
字符串old=“某物”;
//映射
Map mappings=newhashmap();
put('α','a');
//循环映射并执行操作
for(Map.Entry:mappings.entrySet()){
old=old.replace(entry.getKey(),entry.getValue());
}
}

如果您只想将单个
字符
替换为单个
字符
或另一个
字符串
,我已经实施了一个专门的解决方案:

private static Map<Character, Character> REPLACEMENTS = new HashMap<>();
static {
    REPLACEMENTS.put('α','a');
    REPLACEMENTS.put('β','b');
}

public static String replaceChars(String input) {
    StringBuilder sb = new StringBuilder(input.length());
    for(int i = 0;i<input.length();++i) {
        char currentChar = input.charAt(i);
        sb.append(REPLACEMENTS.getOrDefault(currentChar, currentChar));
    }
    return sb.toString();
}

使用for循环执行此操作。有一个地图,其中键为希腊字母,值为拉丁等价物,并在其中循环并执行替换。因为,最后你仍然需要有映射才能知道哪个字母变为什么。你可以使用而不是
replaceAll
,因为你不使用正则表达式。或者您可以使用stringbuilder,这将减少您必须执行的副本数量。此方法是否也适用于替换字符序列?示例“abcd”到“e”。编辑:我刚才看到你提到这只适用于单个字符…不,正如我所解释的:替换多个输入字符需要更复杂的解决方案。我会把它添加到我的回答中。你手边有复杂的解决方案吗?因为我确实需要替换多个字符。我添加了扩展解决方案,最后一个问题。在我自己的行中,我使用了newString和oldString。代码中的哪些元素对应于它们?
private static Map<String, String> REPLACEMENTS = new HashMap<>();
static {
    REPLACEMENTS.put("aa","AA");
    REPLACEMENTS.put("bb","BB");
}
    public static String replace(String input) {
    StringBuilder sb = new StringBuilder(input.length());
    for (int i = 0; i < input.length(); ++i) {
        i += replaceFrom(input, i, sb);
    }
    return sb.toString();
}

private static int replaceFrom(String input, int startIndex, StringBuilder sb) {
    for (Map.Entry<String, String> replacement : REPLACEMENTS.entrySet()) {
        String toMatch = replacement.getKey();
        if (input.startsWith(toMatch, startIndex)) {
            sb.append(replacement.getValue());
            //we matched the whole word skip all matched characters
            //not just the first
            return toMatch.length() - 1;
        }
    }
    sb.append(input.charAt(startIndex));
    return 0;
}