我有问题。我想在java中做密码,它根据ASCII表从字符串中的每个字符输入步骤数。铭文应该只有字母(大和小)和空格(在编码和解码中也是如此)。这是我的代码,输出不打印“z”,编码(第一部分,真正的布尔值)从unicode生成奇怪的字符。
static String Cezar(String tekst, boolean kodek, byte ile){
char c;
int i=0;
int roboczy=0;
String zwracany = new String();
if(kodek==true){
int odchyleniepo122, odchylenieprzed65=0;
while(i<tekst.length()){
//if (c<65)
//c=65;
c=tekst.charAt(i++);
/*if (c>90 && c<97)
c=97;
if (c>122)
c=122;
if(c==32)
c=65;*/
roboczy = (int) c;
roboczy = roboczy + ile;
/*if(roboczy<0){
roboczy=127;
}
if(roboczy>127){
roboczy=0;
}*/
if (roboczy>90 && roboczy<97){
}
if (roboczy>122){
odchyleniepo122=roboczy-122;
//odchylenieprzed122=122-roboczy2;
roboczy=65+odchyleniepo122;
}
if (roboczy<65 && roboczy!=32){
odchylenieprzed65=65-roboczy;
roboczy=122-odchylenieprzed65;
}
if (roboczy==32)
roboczy=65;
c=(char)roboczy;
zwracany=zwracany+c;
}
}
if(kodek==false){
int odchylenieprzed65 = 0;
while(i<tekst.length()){
//if (c<65)
//c=65;
c=tekst.charAt(i++);
/*if (c>90 && c<97)
c=97;
if (c>122)
c=122;
if(c==32)
c=65;*/
roboczy = (int) c;
//roboczy2=roboczy;
roboczy = roboczy - ile;
/*if(roboczy<0){
roboczy=127;
}
if(roboczy>127){
roboczy=0;
}*/
if (roboczy>90 && roboczy<97)
roboczy=97;
if (roboczy>122)
roboczy=122;
if(roboczy<65){
odchylenieprzed65=65-roboczy;
roboczy=122-odchylenieprzed65;
}
if(roboczy==65)
roboczy=32;
c=(char)roboczy;
zwracany=zwracany+c;
}
}
return zwracany;
}
public static void main(String[] args) {
String wynik1;
byte ilosc = 126;
wynik1=Cezar("la la la", true, ilosc);
//wynik1=Cezar(wynik1, false, ilosc);
System.out.println(wynik1);
}
}
答案 0 :(得分:1)
更好的解决方案是定义字母表中可用的字符的常量数组(或者只是字符串,因为它是char []的实现),例如:
String alphabet = "abcd...xyzABCD...XYZ " //don't forget the tailing space
然后替换指定的字符将是:
char substitutionChar = alphabet.charAt(alphabet.indexOf(charToSubstitute) + offset)
它影响性能,因为我们只在一次替换中处理字母表字符串两次,但大大提高了代码的可读性和可管理性。
我还建议您格式化代码。只需在IDE中使用一些自动化工具,无论您认为它多么无用,它都会对您有所帮助:D