我需要循环遍历字符串中的每个字符,并根据它的字符,将其替换为char数组中的另一个字符。
基本上它看起来像这样:
for (int k = 0; k < messageToBeEncrypted.length(); k++)
{
switch(messageToBeEncrypted.charAt(k))
{
case 'a' : messageToBeEncrypted.replace('a', cryptList[0]);
break;
case 'b' : messageToBeEncrypted.replace('b', cryptList[1]);
break;
//it keeps going for each letter of the alphabet
}
System.out.println(messageToBeEncrypted);
}
char数组cryptList是一个随机生成的字母表,&#34; fgtaixnebqwjkzumlydrovsphc&#34; A由f替换,b由g替换,依此类推。我遇到的问题是此代码打印输入的完全相同的消息,因此如果messageToBeEncrypted是ab而不是fg,则打印ab。我怎样才能解决这个问题?如果有更清晰,更简洁的方法来实现这一点,请告诉我。我意识到26个案例陈述可能不是实现我的目标的最佳方式。
答案 0 :(得分:0)
这似乎是关于你的事情(减去残酷的开关声明):
public static String substitutionCipher(String str) {
//i'm assuming that this random alphabet is exactly 26 long, each unique
char[] crypt = "fgtaixnebqwjkzumlydrovsphc".toCharArray();
char[] chars = str.toCharArray();
for(int i = 0; i < chars.length; i++){
chars[i] = crypt[((int) chars[i]) - 97];
}
return new String(chars);
}
但是要回答你原来的问题,它不起作用的原因是字符串是不可变的。通过调用String.replace,它不会修改你的字符串;这实际上是返回字符串的修改版本然后消失,因为你没有存储返回值。 你需要说:
for (int k = 0; k < messageToBeEncrypted.length(); k++)
{
switch(messageToBeEncrypted.charAt(k))
{
case 'a' :
messageToBeEncrypted = messageToBeEncrypted.replace('a', cryptList[0]);
break;
case 'b' :
messageToBeEncrypted = messageToBeEncrypted.replace('b', cryptList[1]);
break;
//etc.
}
System.out.println(messageToBeEncrypted);
}
但我之前提到的方式对记忆有点温和。
答案 1 :(得分:0)
如果您想谷歌,关键字是替换密码。
这是一个简短的帮助:
String messageToBeEncrypted = "HelloWorld".toLowerCase();
String alphabet = "fgtaixnebqwjkzumlydrovsphcab";
StringBuilder sb = new StringBuilder();
int pos;
for (int k = 0; k < messageToBeEncrypted.length(); k++)
{
pos = (messageToBeEncrypted.charAt(k) - 97);
sb.append(alphabet.charAt(pos));
}
System.out.println(sb.toString());
数字97是ASCII表格中的偏移量...我的例子仅适用于小写字母,但每个字母的拼写并不难。