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