Java 重复替换字符串中的字符
我正在尝试创建一个Android应用程序,它可以将普通的十六进制代码转换为smali中使用的反向代码。除了在字符串上使用replace或replaceAll方法时,它甚至会替换已经替换的字符之外,其他所有操作都可以正常工作 比如说,Java 重复替换字符串中的字符,java,android,string,Java,Android,String,我正在尝试创建一个Android应用程序,它可以将普通的十六进制代码转换为smali中使用的反向代码。除了在字符串上使用replace或replaceAll方法时,它甚至会替换已经替换的字符之外,其他所有操作都可以正常工作 比如说, String stringInvert = string.replace("F", "0") .replace("E" , "1") .replace("D" , "2") .replace("C" , "3") .replace("
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方法,它给出了相同的结果。那么,有没有其他方法或方法来解决这个问题呢
完整代码在这里-
抱歉,如果代码很难看,我是在助手中做的
谢谢您可以尝试用以下多个步骤替换:
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" );
不是很好,很聪明,但是很简单,很好用:)你可以创建一个
地图,它可以保存你的地图
然后只需迭代其他原始字符串
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();
Map m=newhashmap();
m、 put('F','0');
....
StringBuilder sb=新的StringBuilder();
for(char c:originalString.toCharArray()){
sb.append(map.get(Character.toUpperCase(c));
}
字符串finalString=sb.toString();
您可以通过在覆盖其位置之前将十六进制数字替换为临时字符来解决此问题
这类似于冒泡排序算法。
例如,让我们使用以下字符串:
FF00F0
首先将F转换为某个字符。“*”例如
字符串现在是**00*0
把0变成F
字符串现在是:**FF*F
最后将*值改为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;
}
此方法将获取任何字母字符并返回等效的数字字符(数字字符的等效函数应该是清晰的),因此只需逐个循环转换每个字符即可
如果您关心速度,这应该非常快,特别是如果您可以使用字符数组而不是字符串。另一种解决方案可以是使用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
非常感谢。工作非常完美,而且它又短又简单,不需要对现有代码进行太多的修改:)