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