2016-08-10 13 views
1

文字列が導入された後に複号で解読されるようなコードを作成すると、文字はaからjまで、a = 0、b = 1 ... j = 9. プログラムは動作しますが、これを実現する最も簡単な方法がありますか?私はjavaで新しいです、そして、現時点では、すべての機能を知っているわけではありません。 コード:文字列の置換と変換

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オブジェクトを作成し、その新しいオブジェクトに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()); 
    }