2016-11-08 145 views
1

我正在寫一個簡單的加密程序。對於'A'&'Z'和'a'&'z'之間的所有字母,我希望將字母表變成'a'是'z'而'b'是'y'。簡單加密

這是我到目前爲止。

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

的問題是程序不區分大小寫,所以如果我輸入大寫或(!)我得到一個錯誤。我想要輸入「GO go go」。有小費嗎?

回答

1

如果你不關心的情況下,你可以做input.toLowerCase()

+0

除此之外,您還可以使用Character.isAlphabetic()來檢查字母以外的字符,以便跳過標點符號。雖然看到你想要包含空格,但你也必須檢查。 – jonhopkins

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

請注意,我沒有運行此代碼,因此指數可能由1被關閉的地方。

+0

我需要包括questionmarks以及。當我輸入要加密的字符串時,不僅有字母嗎? – user3178735

+1

然後你可以更新那個正則表達式。順便說一句,你應該在你的問題中包括這樣的要求... –

+0

我明白了,謝謝!對不起,這是新的。 – user3178735

0

如果您不想區分大小寫,您可以嘗試使用variablename*.equalsIgnoreCase(variablename*)。還有其他的選擇,例如預先轉換字符串以使其正常化。

正如Lidae指出的那樣,input.toLowerCase()會相當容易地完成標準化。

-1

你想實施Ceasar密碼,除非它的學術我建議你只是爲自己查找一個實現。

http://practicalcryptography.com/ciphers/caesar-cipher/

+1

OP沒有實施Ceasar密碼。他不只是轉移所有角色。對於給定的密鑰,將密鑰中位置'x'處的字符加密爲密鑰中位置'length - x'處的字符。 –

+0

你是對的,他沒有實施一般塞薩爾密碼,但它仍然是塞薩爾密碼,只是一個特例。一個通用的實現可以做他想要處理的案例和標點符號。 –

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

你可以簡單地打開輸入小寫只有通過字符串循環時加密字母字符的另一種方式。在這種情況下,你也不需要字母串。只需從角色中減去'a'即可獲得索引。

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

你可以做到這一點從122從其減去您的字符的整型值,並根據您的char是加「一」或「A」大寫或小寫。

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