Java-在不覆盖最后一个字符的情况下替换多个字符
我正在尝试制作某种加密和解密程序,它将一个字母转换成键盘上的下一个字母(如下所示) (数据是一个字符串)Java-在不覆盖最后一个字符的情况下替换多个字符,java,replace,character,overwrite,Java,Replace,Character,Overwrite,我正在尝试制作某种加密和解密程序,它将一个字母转换成键盘上的下一个字母(如下所示) (数据是一个字符串) 用这段代码,它把“q”变成“w”,但同样的“w”变成“e”,我不希望这种情况发生。如何避免这种情况?这种编码方法称为凯撒密码。通过谷歌搜索Caesar cipher会得到很多代码片段。为方便起见,我在下面附上了一段代码片段 class CaesarCipher { private final String ALPHABET = "abcdefghijklmnopqrstuvwxyz
用这段代码,它把“q”变成“w”,但同样的“w”变成“e”,我不希望这种情况发生。如何避免这种情况?这种编码方法称为凯撒密码。通过谷歌搜索Caesar cipher会得到很多代码片段。为方便起见,我在下面附上了一段代码片段
class CaesarCipher {
private final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
public String encrypt(String plainText,int shiftKey)
{
plainText = plainText.toLowerCase();
String cipherText="";
for(int i=0;i<plainText.length();i++)
{
int charPosition = ALPHABET.indexOf(plainText.charAt(i));
int keyVal = (shiftKey+charPosition)%26;
char replaceVal = this.ALPHABET.charAt(keyVal);
cipherText += replaceVal;
}
return cipherText;
}
public String decrypt(String cipherText, int shiftKey)
{
cipherText = cipherText.toLowerCase();
String plainText="";
for(int i=0;i<cipherText.length();i++)
{
int charPosition = this.ALPHABET.indexOf(cipherText.charAt(i));
int keyVal = (charPosition-shiftKey)%26;
if(keyVal<0)
{
keyVal = this.ALPHABET.length() + keyVal;
}
char replaceVal = this.ALPHABET.charAt(keyVal);
plainText += replaceVal;
}
return plainText;
}
其中shiftkey的值确定需要移位的字符数。例如,如果shiftkey=4,则所有A将替换为D
来源:希望这会有所帮助,这会起到作用:
String data = "...";
StringBuilder finalData = new StringBuilder(data.length());
for(int i = 0; i < data.length() - 1; i++) {
char replacement = getReplacement(data.charAt(i));
finalData.append(replacement);
}
finalData.append(data.charAt(data.length() - 1));
String result = finalData.toString();
String data=“…”;
StringBuilder finalData=新的StringBuilder(data.length());
对于(int i=0;i
看起来您正试图将键盘上的某个键映射到右侧的键。可以使用HashMap手动将每个键映射到特定字符。为这么多字符添加映射是非常乏味的!我不知道如何动态地映射它们
public static void foo(String str) {
HashMap<Character, Character> map = new HashMap<Character, Character>();
char c;
StringBuilder sb = new StringBuilder();
map.put('q', 'w');
map.put('w', 'e');
map.put('e', 'r');
... // Add some more mappings here
...
for (int i = 0; i < str.length(); i++) {
c = str.toLowerCase().charAt(i);
sb.append(map.get(c));
}
String result = sb.toString();
System.out.println(result);
}
publicstaticvoidfoo(stringstr){
HashMap=newHashMap();
字符c;
StringBuilder sb=新的StringBuilder();
map.put('q','w');
地图放置('w','e');
map.put('e','r');
…//在此处添加更多映射
...
对于(int i=0;i通过char
在字符串
上循环。在int
值中添加一个,除非它是z
或z
。不是OP问题的答案。另外:在大多数键盘上,z
的“下一个字母”是x
。我该怎么做?(我上周刚开始编程)对于你的情况,你可以设置shiftkey=1,这样它就可以将“A”例如变成“B”。不是键盘上的下一个字母。将此字符串从“abcdefghijklmnopqrstuvwxyz”更改为“qwerty…….m”字符,就像在qwerty键盘中一样,这将完成此操作!“…getRec=placement(data.charAt(i));”当我在那里遇到错误时该怎么办。getReplacement()将为您提供所需的替换,例如getReplacement('q')应该为您提供'w'我需要为此创建新函数吗?正如eclipse所说的,我最终将getReplacement()作为一个函数,因为这似乎是合乎逻辑的。但我还必须删除for循环中的“-1”,并删除“finalData.append(data.charAt(data.length()-1));”,因为它添加了一个额外的字母。
String data = "...";
StringBuilder finalData = new StringBuilder(data.length());
for(int i = 0; i < data.length() - 1; i++) {
char replacement = getReplacement(data.charAt(i));
finalData.append(replacement);
}
finalData.append(data.charAt(data.length() - 1));
String result = finalData.toString();
public static void foo(String str) {
HashMap<Character, Character> map = new HashMap<Character, Character>();
char c;
StringBuilder sb = new StringBuilder();
map.put('q', 'w');
map.put('w', 'e');
map.put('e', 'r');
... // Add some more mappings here
...
for (int i = 0; i < str.length(); i++) {
c = str.toLowerCase().charAt(i);
sb.append(map.get(c));
}
String result = sb.toString();
System.out.println(result);
}