2016-08-10 2 views
1

문자열을 입력 한 다음 이중 숫자로 암호를 해독하는 것과 같은 암호를 사용하면 문자는 a에서 j까지이며 a = 0, b = 1 ... j가 될 수 있습니다 = 9. 프로그램이 작동하는데, 이것을 달성하는 가장 쉬운 방법이 있는지 알고 싶습니다. 나는 자바에 새로운 순간에 모든 기능을 모른다. 코드 :보기의 암호화 관점에서문자열 바꾸기 및 변환

import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.lang.Double; 
public class Decrypt 
{ 
    private static String conversionTable[][] = { 
     {"a", "0"}, 
     {"b", "1"}, 
     {"c", "2"}, 
     {"d", "3"}, 
     {"e", "4"}, 
     {"f", "5"}, 
     {"g", "6"}, 
     {"h", "7"}, 
     {"i", "8"}, 
     {"j", "9"}, 
    }; 
    private static Scanner scanner; 

    public static double decrypt(String encryptedNumber) 
    { 
     String c = ""; 
     int i = 0; 
     String[] s = encryptedNumber.split(""); 

     for(int j = 0; j < 2; j++) { 
      if(c.length() == s.length) 
       break; 

      for(int k = 0; k < 9; k++) { 
       if(c.length() == s.length) 
        break; 
       if(conversionTable[k][j].equalsIgnoreCase(s[i])){ 
        c += k; 
         i++; 
       }else if(s[i].equalsIgnoreCase(".")){ 
        c += "."; 
        i++; 
       } 
      } 
      j--; 
     } 

     double d = Double.parseDouble(c); 
     return d; 
    } 

    public static void main(String arg[]) 
    { 
     scanner = new Scanner(System.in); 
     System.out.println("Enter the string to decrypt:"); 
     String input=scanner.next(); 
     System.out.println("Number after decryption is:"+decrypt(input)); 
    } 
} 
+1

음, char는 단지 데이터 유형입니다. 및 char 값 ...은 숫자로 표현할 수 있습니다 (예 : https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html ...). 오직 아스키 문자 만 허용합니다 ... 당신은지도가 필요 없으며 간단한 계산을 할 수 있습니다. 독자에게 운동으로 남겨두기. – GhostCat

답변

0

는 당신이 설명하는 것은 substitution cipher입니다. 나는이 암호화를 더 이상 고려하지 않고, 인코딩과 더 비슷합니다 (here 참조).

문자열에 문자열이 추가되었습니다.

c += k; 

실제로 Java가 수행하는 작업은 새로운 String 객체를 만들고이 객체의 포인터를 새 객체로 변경하는 것입니다. JVM은 수명이 짧은 오브젝트를 생성하고 삭제할 때 수년 동안 훨씬 나아졌지만 여전히 비효율적입니다. 대신 StringBuilder을 사용해보세요.

귀하의 conversionTable을 통해 귀하의 전체 알고리즘이 O (n^2) 연산 (here 참조)임을 의미합니다 (nitpickers의 경우 O (m * n)이지만 실제로는 나를). 그러한 작은 테이블에는 전혀 관련이 없지만 가능하다면 그렇게하지 마십시오. 게다가, 언어로 작성된 내용이 당신을 위해 그것을 원할 때 (직접 반복되는 주제가 될 것입니다.) 직접 작성하는 것이 중요하지 않습니다. 바이너리 서치() 구현 중 하나를 활용할 수 있도록 항목이 순서대로 있습니다. Arrays. 나는 조금씩 사용법을 고안해 낼 것이지만, 그것은 설명의 목적을위한 것이다.

향상된 for 루프를 활용하여 대부분의 목록을 반복 할 수 있습니다. 지금까지는 향상된 for 루프를 사용할 수 없다면 while 루프를 심각하게 고려해야한다고 말할 수 있습니다.

스위치가 아닌 다른 스위치에서 break 문을 사용하지 마십시오. 대부분의 사람들은 그들이 동일한 배에 있다고 생각할 것입니다. goto.

변수에 더 구체적인 이름을 지정하십시오. 너의 미래는 너에게 고맙다.

그래서 내가 요약 한 변화에 우리는 다음과 같은 해독() 메소드로 끝날 :

public static double decrypt(String encryptedNumber) { 
    StringBuilder builder = new StringBuilder(); 
    int i = 0; 
    String[] encNumElements = encryptedNumber.toLowerCase().split(""); 
    for (String element : encNumElements) { 
     int foundAt = Arrays.binarySearch(conversionTable, new String[]{element, ""}, new Comparator<String[]>() { 
      @Override 
      public int compare(String[] arg0, String[] arg1) { 
       return arg0[0].compareTo(arg1[0]); 
      }    
     }); 
     if (foundAt >= 0) { 
     builder.append(conversionTable[foundAt][1]); 
     } else { 
     // assuming a decimal point here since it's not on the list 
     builder.append('.'); 
     } 
    } 

    double d = Double.parseDouble(builder.toString()); 
    return d; 
} 

이는 조금 더 낫다. 이와 비슷한 것을 정말로하고 싶다면 Comparator는 별도의 클래스가 될 것입니다. 그러나 이것은 일러스트레이션을 위해 작동합니다.

코딩의 관점에서 볼 때 룩업 테이블이 있습니다. 쉬운 구현은 Map입니다. 전통적으로 정적 인 룩업 맵을 초기화하는 것은 좀 못생긴 일이지만 i_am_zero의 대답 here을 자바 8로 깔끔하게 처리하는 방법을 확인하십시오. 맵은 자연스러운 검색 구조이므로 순서는 중요하지 않습니다. 또한 Map에 소수점을 넣으면서 if 문을 제거하는 좋은 부작용이 있습니다.

private static final Map<String, String> conversionMap = Stream.of(
     new SimpleEntry<>("a", "0"), 
     new SimpleEntry<>("b", "1"), 
     new SimpleEntry<>("c", "2"), 
     new SimpleEntry<>("d", "3"), 
     new SimpleEntry<>("e", "4"), 
     new SimpleEntry<>("f", "5"), 
     new SimpleEntry<>("g", "6"), 
     new SimpleEntry<>("h", "7"), 
     new SimpleEntry<>("i", "8"), 
     new SimpleEntry<>("j", "9"), 
     new SimpleEntry<>(".", ".")) 
     .collect(Collectors.toMap((se) -> se.getKey(), (se) -> se.getValue())); 

    public static double decrypt(String encryptedNumber) { 
     StringBuilder builder = new StringBuilder(); 
     String[] encNumElements = encryptedNumber.toLowerCase().split(""); 
     for (String element : encNumElements) {   
      builder.append(conversionMap.get(element)); 
     } 

     double d = Double.parseDouble(builder.toString()); 
     return d; 
    } 

이런 일반적인 상황에서 나는 멈출 것입니다. 하지만 조회 목록은 일련의 정수로 이루어진 일련의 문자입니다. Java는 실제로 원시 문자를 정수로 처리하므로 수학을 할 수 있습니다. String은 문자열에서 문자를 가져 오는 메서드를 제공하기 때문에 문자열을 직접 반복 할 수 있습니다.우리는 다시 if에서 소수점을 처리해야하지만, 조회 테이블을 완전히 없애 버릴 수 있습니다.

public static double decrypt(String encryptedNumber) { 
     StringBuilder builder = new StringBuilder(); 
     for (char ch : encryptedNumber.toLowerCase().toCharArray()) { 
     if (ch == '.') { 
      builder.append('.'); 
     } else { 
      builder.append(ch - 'a'); 
     } 
     } 
     return Double.parseDouble(builder.toString()); 
    }