我正在编写一个简单的加密程序。对于A' A'之间的所有字母&安培; ' Z'和' a' &安培; ' Z'我想把字母变成'a' a'是' z'和' b'是'。
这是我到目前为止所做的。
public static void deCrypt() {
char[] alphabet = "abcdefghijklmnopqrstuvwxyz ".toCharArray();
char[] crypt = "zyxwvutsrqponmlkjihgfedcba ".toCharArray();
Scanner scan = new Scanner(System.in);
System.out.print("Mata in meddelandet: ");
String input = scan.nextLine();
for (int i = 0; i < input.length(); i++) {
char temp = input.charAt(i);
int tempNums = (new String(alphabet).indexOf(temp));
System.out.print(new String(crypt).charAt(tempNums));
}
}
问题是程序不区分大小写,所以如果我输入大写或(!)我会收到错误。我希望能够输入&#34; GO go Go&#34;。有什么提示吗?
答案 0 :(得分:1)
如果您不关心案件,可以input.toLowerCase()
答案 1 :(得分:0)
您可以添加一个if语句,检查该字母是否为字符。
您可以使用"someString".matches("[ a-z]")
,如果它是小写字符或空格,则返回true,否则返回false。同样,您可以将正则表达式"[ A-Z]"
用于大写。
你可以这样做:
public static void deCrypt() {
String alphabetLowerCase = "abcdefghijklmnopqrstuvwxyz ";
String alphabetUpperCase = alphabetLowerCase.toUpperCase();
int length = alphabetLowerCase.length();
Scanner scan = new Scanner(System.in);
System.out.print("Mata in meddelandet: ");
String input = scan.nextLine();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (String.valueOf(c).matches("[ a-z]")) {
System.out.print(alphabetLowerCase.charAt(length - alphabetLowerCase.indexOf(c)));
} else if (String.valueOf(c).matches("[ A-Z]")) {
System.out.print(alphabetUpperCase.charAt(length - alphabetUpperCase.indexOf(c)));
}
}
}
请注意,我没有运行此代码,因此索引可能会在某个地方偏离。
答案 2 :(得分:0)
如果您希望它不区分大小写,可以尝试使用variablename*.equalsIgnoreCase(variablename*)
。有一些替代方法,比如事先转换字符串以规范它。
正如Lidae指出的那样,input.toLowerCase()
可以很容易地完成归一化。
答案 3 :(得分:0)
这是另一种方法
String alphabet = "abcdefghijklmnopqrstuvwxyz";
String input = "Go go GO";
for(int i=0; i < input.length(); i++) {
int index = alphabet.indexOf(Character.toLowerCase(input.charAt(i)));
if (index == -1) {
System.out.print(input.charAt(i));
continue;
}
char encrypted = alphabet.charAt(25 - index);
if (Character.isUpperCase(input.charAt(i))) {
System.out.print(Character.toUpperCase(encrypted));
} else {
System.out.print(encrypted);
}
}
答案 4 :(得分:0)
您可以简单地将输入转换为小写,并仅在循环字符串时加密字母字符。在这种情况下,您也不需要字母表字符串。只需减去&#39; a&#39;从角色获取索引。
String crypt = "zyxwvutsrqponmlkjihgfedcba";
Scanner scan = new Scanner(System.in);
System.out.print("Mata in meddelandet: ");
String input = scan.nextLine().toLowerCase();
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isLetter(ch)) {
ch = crypt.charAt((int)(ch - 'a'));
}
System.out.print(ch);
}
答案 5 :(得分:0)
这是一个私人功能,可以做你想做的事情:
private String encrypt(String input) {
String alphabet = "abcdefghijklmnopqrstuvwxyz ";
List<Character> list = alphabet.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
String output = "";
for(int i = 0; i < input.length(); i++) {
output += list.get(list.size() - list.indexOf(input.toLowerCase().charAt(i)) -1);
}
return output;
}
它将您的字母字符串转换为列表并循环输入,从列表中收集相反的顺序并返回编码的输出字符串。 需要Java 8。
像这样使用:
encrypt("GO go GO") // Returns "umaumaum"
答案 6 :(得分:0)
您可以通过从122中减去char的int值并添加“a”或“A”来实现此目的,具体取决于您的char是大写还是小写。
public static String deCrypt(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i<str.length(); i++){
sb.append((char)(122-str.toLowerCase().charAt(i)+ ((Character.isLowerCase(str.charAt(i)))?'a':'A')));
}
return sb.toString();
}
答案 7 :(得分:-1)
你想要实现一个Ceasar密码,除非它的学术我建议你只为自己查找一个实现。