我正在创建一个简单地对字符串进行加扰的应用程序,并且可以将它重新组合在一起。它遵循一个简单的密码。我正在使用这样的代码:
String oldstr = "Hello"
String newstr = old.replace("e", "l").replace("l", "t");
我只是放了一点点,因为如果我把整个事情写出来,那就太大了。
关于问题。程序的工作方式,它首先用“l”替换“Hello”中的“e”,将字符串转换为“Hlllo”。然后用“t”替换“l”。但是,我不希望“e”最终成为“t”,因为那时我不能把它变成原来的。我希望这个应用程序工作的方式,结果将是“Hltto”。有没有办法可以同步应用程序,以便它可以这样做?
修改
我不是在寻找只适用于这种情况的答案(在我的实际应用中,我有26个字符被更改)。
答案 0 :(得分:2)
密码应可逆。
这意味着,所有操作都必须是可逆的。替换操作不是因为它将两个不同的字符映射到一个。 (你的'e'和'l'都映射到'l')
您必须构建一个表格,其中包含每个角色的内容,并根据该表格更改每个角色。例如:
a→...
b→...
c→...
d→...
e→l
...
l→t
...
确保右侧没有重复项。
然后迭代字符串中的每个字符并构建一个新字符串。
StringBuilder sb = new StringBuilder(old.length());
for (char c : oldStr.toCharArray())
sb.append( replaceChar(c) );
newStr = db.toString().
函数replaceChar(c)
可以像查找表一样简单,或者为了更方便编码,可以是26项开关语句,或者(如真实加密中)依赖于键的数学函数。
另外,请注意大写和小写字母之间应该发生什么以及其他字符会发生什么(例如'à','ÿ','気',...)
答案 1 :(得分:1)
考虑使用Map
处理字符串char-by-char进行替换:
// replacement map
static final Map<Character, Character> REPLACEMENTS = new HashMap<>();
// fill up replacements
static {
for (String r : "el,lt,te,ab,ba".split(",")) // add all replacement pairs you need
REPLACEMENTS.put(r.charAt(0), r.charAt(1)); // e→l, l→t, t→e, a→b, ...
}
// encoding method
static public String encode(String input) {
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray())
sb.append(REPLACEMENTS.getOrDefault(c, c));
return sb.toString();
}
要查看它是如何工作的,请致电:
System.out.println(encode("Hello")); // Hltto
答案 2 :(得分:0)
一种方法可以实现的是具有二进制值的Bitmap / bitstring /数组。随便打电话给你。这样每个位代表一个字母。最初在加密之前,所有位都是0.然后当你改变一些字母时,你转到位数组并翻转相应的位。通过这种方式,您知道它已被更改,因此下一次传递将仅更改位数组中对应于0的字母。 或者您只需一次通过即可完成所有加密工作。
for (int i = 0; i < oldstring.length; i++) {
switch (oldstring.charAt(i)) {
.....
.
.
.
.....
default: do nothing.
}
}