ビューの暗号観点からあなたが記述しているものはsubstitution cipherです。私はこの暗号化をもはやエンコーディングのようには考えていないでしょう(here参照)。
文字列が文字列に追加されています。
c += k;
実際にJavaが実際に行っていることは、新しいStringオブジェクトを作成し、その新しいオブジェクトにcのポインタを変更することです。短命オブジェクトを作成して破棄するとき、JVMは長年にわたりずっと良くなっていますが、これはまだ非常に非効率的です。代わりにStringBuilderを使用してください。
あなたはまた、(hereを参照してください)あなたの全体のアルゴリズムはO(N^2)の操作であることを意味している、あなたの変換テーブルを通じてsequential searchを実行している(nitpickersのために、それは実際にはO(m個の* nのだ)が、それがために十分に近いです私)。このような小さなテーブルにはまったく関係ありませんが、できるだけそのようなことはしないでください。加えて、言語の中の何かがあなたのためにやりたいと思っているときには、自分自身で書くことはほとんどありません(これは繰り返しテーマになります)。あなたの商品は順番に並んでいるので、ArraysのbinarySearch()実装の1つを利用することができます。私は少し使い方を工夫しますが、それは説明のためです。
強化された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をJava 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