2016-05-08 3 views
-2

私は文字列を単にスクランブルして戻すことができるアプリケーションを作成しています。それは単純な暗号に従います。私はこのようなコードを使用しています:暗号を同期させる

String oldstr = "Hello" 

String newstr = old.replace("e", "l").replace("l", "t"); 

私は全体の事を書いた場合、それは巨大になるので、私は唯一のほんの少しを置きます。

問題が発生しました。プログラムが動作する方法は、最初に "Hello"の "e"を "l"に置き換え、文字列を "Hlllo"に置き換えます。次に、 "l"を "t"に置き換えます。しかし、私は "e"が最終的に "t"になることを望んでいません。それ以来、私はそれを元に戻すことができません。このアプリケーションを動作させる方法は、結果は "Hltto"です。これを行うためにアプリケーションを同期する方法はありますか?

EDIT:

私は(私の実際のアプリケーションでは、私が変更されている26個の文字を持っている)、このシナリオのために働くの答えを捜しているわけではありません。

+0

まずTとLを置き換え、そして、EをLに置き換えれば、出力は得られますが、この1つのシナリオでのみ動作します –

答えて

2

暗号は、可逆である必要があります。

つまり、すべての操作は元に戻す必要があります。置換操作は、2つの異なる文字を1つにマップするためではありません。

各キャラクターの表を作成し、その表に基づいて各キャラクターを変更する必要があります。

→ ...
B → ...
C → ...
D → ...
E →リットル
...
L → T:例えば
...

う右側に重複がないことを確認してください。

文字列内の各文字を繰り返し、新しい文字列を作成します。

StringBuilder sb = new StringBuilder(old.length()); 

for (char c : oldStr.toCharArray()) 
    sb.append(replaceChar(c)); 

newStr = db.toString(). 

機能replaceChar(c)は、ルックアップテーブルのような単純なことができ、またはそれ以上のコーディング便宜のために、26エントリswitch文、または(実際の暗号のように)キー依存数学関数とすることができます。また

、大文字と小文字とどのような他の文字に何が起こるの間でどうするかを意識する(「Y」、「A」のように、「気」、...)

+0

私はJavaに慣れていないので、私はいくつかのサンプルコードを与えることができます(多分2-entry switch文が何を意味するのか)私が試したときにエラーが出たので。 – nousername

+0

@nousernameこれは、皆さんがJavaで経験したこと、つまり、私たちがやったこと、勉強し、コードを書いて、デバッグし、学んだことです。 – zaph

0

それができる一つの方法ビットマップ/ビットストリング/バイナリ値の配列を持つことです。あなたが欲しいものを呼んでください。各ビットが文字を表すように。最初に暗号化する前に、すべてのビットが0になります。次に、ある文字を変更すると、ビット配列に行き、対応するビットを反転します。このように変更されたことを知っているので、次のパスはビット配列の0に対応する文字だけを変更します。 または、1回のパスですべての暗号化を実行できます。

for (int i = 0; i < oldstring.length; i++) { 
    switch (oldstring.charAt(i)) { 
     ..... 
     . 
     . 
     . 
     ..... 
     default: do nothing. 
     } 
} 
+0

switch文を実行しようとすると、エラーが発生します。私はJavaで経験したことがないので、おそらく何か間違っています。あなたが私に実例を与えることができれば嬉しいです(switch文の2つのエントリだけかもしれません)。 – nousername

1

は、文字列文字ごとに文字の置き換え用Map使用して処理を考えてみましょう:それは働いているかを確認するには

// replacement map 
static final Map<Character, Character> REPLACEMENTS = new HashMap<>(); 

// fill up replacements 
static { 
    for (String r : "el,lt,te,ab,ba".split(","))  // add all replacement pairs you need 
     REPLACEMENTS.put(r.charAt(0), r.charAt(1)); // e→l, l→t, t→e, a→b, ... 
} 

// encoding method 
static public String encode(String input) { 
    StringBuilder sb = new StringBuilder(); 
    for (char c : input.toCharArray()) 
     sb.append(REPLACEMENTS.getOrDefault(c, c)); 
    return sb.toString(); 
} 

を呼び出す:

System.out.println(encode("Hello")); // Hltto 
+0

私はJavaでの経験がないので、私は完全に混乱しています。実際の例がうまくいくでしょう。あなたがコードに入れてくれてありがとう、ありがとう。 – nousername

+0

@nousername now(小さな編集の後)、このコードは完全に動作します。どのように動作するかは、デバッグモードで段階的に実行することができます(ところで、それは非常に簡単です)。 'Map'は、Javaで使われる非常に一般的なデータ構造であり、' StringBuilder'も使用されています。 –

関連する問題