重复替换String中的字符

时间:2014-02-14 10:05:23

标签: java android string

我正在尝试创建一个Android应用,将普通的十六进制代码转换为在smali中使用的倒置代码。除了在String上使用replace或replaceAll方法时,一切都很完美,它甚至替换已经替换过的字符

例如,

String stringInvert = string.replace("F", "0")
    .replace("E" , "1")
    .replace("D" , "2")
    .replace("C" , "3")
    .replace("B" , "4")
    .replace("A" , "5")
    .replace("9" , "6")
    .replace("8" , "7")
    .replace("7" , "8")
    .replace("6" , "9")
    .replace("5" , "A")
    .replace("4" , "B")
    .replace("3" , "C") 
    .replace("2" , "D")
    .replace("1" , "E")
    .replace("0" , "F"); 

正如你所看到的那样,第一个F被改为0,同样其他字母也被改变,但是后来0被改为F,这也将已经改变的F改回F.所以,总而言之,只有7之前的字母/数字被反转(因为它们在代码之后被替换)而其他字母/数字由于双重反转而保持相同。我甚至尝试过replaceAll方法,它给出了相同的结果。那么有没有其他方法或解决这个问题?

完整代码在这里 - http://pastebin.com/dB23JmQG

如果代码很丑,我很抱歉,我是在AIDE

中完成的

谢谢

5 个答案:

答案 0 :(得分:5)

您可以创建一个Map<Character, Character>来保存您的地图。

然后只迭代其他原始String

Map<Character, Character> m = new HashMap<>();
m.put('F','0');
....

StringBuilder sb = new StringBuilder();
for(char c : originalString.toCharArray()){
   sb.append(map.get(Character.toUpperCase(c)));
} 
String finalString = sb.toString();

答案 1 :(得分:1)

您可以尝试使用以下多个步骤进行替换:

String stringInvert = string
.replace("F", "null")
.replace("E" , "one")
.replace("D" , "two")
.replace("C" , "three")
.replace("B" , "four")
.replace("A" , "five")
.replace("9" , "six")
.replace("8" , "seven")
.replace("7" , "8")
.replace("6" , "9")
.replace("5" , "A")
.replace("4" , "B")
.replace("3" , "C") 
.replace("2" , "D")
.replace("1" , "E")
.replace("0" , "F")
.replace("null", "0")
.replace("one","1")
.replace("two","2" )
.replace("three","3" )
.replace("four","4" )
.replace("five","5" )
.replace("six","6" )
.replace("seven","7" );

不漂亮聪明,但又简单又有效:)

答案 2 :(得分:1)

您可以通过在覆盖其位置之前将十六进制数字替换为临时字符来解决问题。

这与bubble bubble algorithem类似。 举个例子,让我们使用以下字符串: FF00F0

  1. 首先将F转换为某个角色。 '*' 例如。 字符串现在是** 00 * 0
  2. 将0变为F. 字符串现在是:** FF * F
  3. 最后将*转为0。
  4. 有更高效的解决方案,但这个解决方案简单快捷。

答案 3 :(得分:0)

这不适用于将字符随机映射到其他字符,但由于您的模式有一个模式,您可以创建一个函数,使用它们的char / int值转换每个字符,例如:

static char convert(char c){
    int n = c;
    n = n - 70; // Adjust for capital F
    n = n * -1; // So earlier letters become larger numbers
    n += 48; // Adjust back to zero
    return (char)n;
}

此方法将接受任何字母字符并返回等效数字字符(并且数字字符的等效函数应该清除),因此只需循环转换每个字符。

如果你关心速度,这应该非常快,特别是如果你可以使用char数组而不是字符串。

答案 4 :(得分:0)

另一种解决方案可能是使用Integer API:

String stringToInvert = "A1F56C";

StringBuilder sb = new StringBuilder();
for (char c : stringToInvert.toCharArray()) {
    sb.append(Integer.toHexString(15 - Integer.valueOf(c + "", 16)));
}

System.out.println(sb.toString().toUpperCase());

<强>输出:

  

5E0A93