繁体   English   中英

重复替换String中的字符

[英]Repeated replacement of characters in 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中做到了

谢谢

您可以创建一个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();

你可以尝试用这样的多个步骤替换:

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" );

不漂亮和聪明,但简单和工作:)

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

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

  1. 首先将F转换为某个角色。 '*' 例如。 字符串现在是** 00 * 0
  2. 将0变为F字符串现在是:** FF * F.
  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数组而不是字符串。

另一种解决方案可能是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM