Java 7 でデスクトップ アプリを開発しています。ここに状況があります。以下の方法で
private synchronized void decryptMessage
(CopyOnWriteArrayList<Integer> possibleKeys, ArrayList<Integer> cipherDigits)
{
// apply opposite shift algorithm:
ArrayList<Integer> textDigits = shiftCipher(possibleKeys, cipherDigits);
// count CHI squared statistics:
double chi = countCHIstatistics(textDigits);
if(chi < edgeCHI) // if the value of IOC is greater or equal than that
{
System.err.println(chi + " " + possibleKeys + " +");
key = possibleKeys; // store most suitable key
edgeCHI = chi;
}
}
「chi」と呼ばれる値をカウントし、それに基づいて「chi」が「edgeCHI」値よりも小さい場合は、キーをインスタンス変数に保存します。そのメソッドは一部のスレッドによって呼び出されるため、同期を強制します。
すべてのスレッドが完了すると、一連の操作を制御するメソッドに制御を渡すことによって、プログラムの実行が続行されます。次に、この行がそのメソッドで実行されました。
System.err.println(edgeCHI+" "+key+" -");
methodで 'chi' の最後の値を出力したように、'chi' の正しい値を出力しますdecryptMessage
が、key の値は異なります。キー値を生成するスレッドによって「decryptMessage」メソッドが呼び出されました。
キー値をグローバル変数として保存します
private volatile CopyOnWriteArrayList<Integer> key = null; // stores the most suitable key for decryption
。2 つの異なるキー値があるのはなぜですか? 値自体は重要ではありません。問題は、「decryptMessage」メソッド (chi < edgeCHI の場合) での最後の呼び出しで出力されたキーの値が、操作の流れを制御するメソッドで出力された値と一致する必要があることです。スレッドの作成方法は次のとおりです。
for(int y = 0; y < mostOccuringL.length; y++){// iterate through the five most frequent letters
for(int i = (y + 1); i < mostOccuringL.length; i++ ){//perform letter combinations
int [] combinations = new int[2];
combinations[0] = y;
combinations [1] = i;
new KeyMembers(""+y+":"+i ,combinations, keywords, intKeyIndex, cipherDigits).t.join();
}
}
run メソッド内で、 decryptMesssageメソッドを呼び出して、最も実現可能な復号化キーを特定します。2日間、何が問題なのかを理解しようとしてきましたが、わかりません。提案?