我目前正在尝试遍历一个String数组,用相应的字母替换单词中的每个字母。我有一个类的数组,存储一个名为letter Occurrence的字母,我的每个字母都有一个出现在我原始字符串中的字母,它存储了23个字母的字符(Z从未出现在我的原始字符串中)我然后我的班级从最常见的字母到最常见的字母排序。
这是我要更改的原始文字字符串:
vaoyelsy lsty aajp l a k urd aoofeia upd, kxflup lo oatqaosavailmjakqp ks oatqao frdap ks l k, l dtq dfisoak tva aoyifqqia fja lo dafo toakqp. toakqp tva aoy fqqia fja lo trdlqdao, ks k da lja acfkp da fpoumqflk b atra b da lois.pmath aksaoiy l daj. aq daoa a fkskapp k luo tra, k luo yap, k luo jfia, k da tojqd b luo oaaqfkc. iwtyp tva daaobui jfia. lk'q kiy fva luo toa, uq fva luo atoq p aii.qda loa lu tva, da loa lu oa rrumfas, da app lu fva. uq da app lu tva da loa oaa lu oa. lvaoqy lo p p oaaslj. q p lq loqfbfrtqflk, aktkra.fq p lybui oaaslj. daoa p l aiavfpflk aoa, l dfp, l dtq. uq a oa aobarqiy tmmy
。
下面是letterOccurence数组的输出。
a - 12.3342175066313%
o - 6.23342175066313%
l - 5.570291777188329%
q - 3.8461538461538463%
f - 3.580901856763926%
k - 3.580901856763926%
p - 3.4482758620689653%
d - 3.183023872679045%
t - 3.050397877984085%
u - 2.7851458885941645%
i - 2.3872679045092835%
s - 1.7241379310344827%
y - 1.7241379310344827%
v - 1.5915119363395225%
j - 1.4588859416445623%
r - 1.3262599469496021%
b - 0.9283819628647214%
m - 0.7957559681697612%
c - 0.2652519893899204%
e - 0.2652519893899204%
h - 0.1326259946949602%
w - 0.1326259946949602%
x - 0.1326259946949602%
并且我的代码替换了字母。
char[] letterFrequency = {'e','t','a','o','i','n','s','h','r','d','l','c','u','m','w','f','g','y','p','b','v','k','j','x','q','z'};
String codeBreak = "";
for(int cnt = 0; cnt < words.length;cnt++){
for(int i = 0;i < letterOccurences.size(); i++){
words[cnt] = words[cnt].replace(letterOccurences.get(i).GetLetter(),letterFrequency[i]);
}
codeBreak += " ";
codeBreak += words[cnt];
}
System.out.println("~~~~" + codeBreak);
所以理论上所有的字母都是&#39; a&#39;应该改为e,但事实并非如此,这是我输出的消息。
ybfubapu apfu bbkp a b n dfv bfflblb dpv, njladp af fbfobfpbyblaykbnop np fbfobf lfvbp np a n, a vfo vllpfbn fyb bfulloolb lkb af vblf ffbnop. ffbnop fyb bfu loolb lkb af ffvaovbf, np n vb akb bplnp vb lpfdyolan g bffb g vb aflp.pybfv bnpbflu a vbk. bo vbfb b lnpnbpp n adf ffb, n adf ubp, n adf kllb, n vb ffkov g adf fbbolnp. lkfup fyb vbbfgdl kllb. an'o nlu lyb adf ffb, do lyb adf bffo p bll.ovb afb ad fyb, vb afb ad fb ffdylbp, vb bpp ad lyb. do vb bpp ad fyb vb afb fbb ad fb. aybfou af p p fbbpak. o p ao afolglffolan, bnfnfb.lo p augdl fbbpak. vbfb p a blbylplan bfb, a vlp, a vfo. do b fb bfgbfolu fyyu.
正如你所看到的那样,第二封信最初是一封&#39; a&#39;并应替换为&#39; e&#39;但它显示&#39; b&#39;
答案 0 :(得分:0)
由于您要重新分配words[cnt] = words[cnt].replace()
,您似乎先将a
更改为e
,然后将此e
更改为b
。
您应该遍历words[cnt]
中的所有字母,将其翻译成新字母并将其附加到StringBuilder builder
。然后,在循环结束后,为words[cnt]
分配builder.toString()
的值。
StringBuilder builder = new StringBuilder();
for (int pos = 0; pos < words[cnt].length(); pos++) {
builder.append(translateLetter(words[cnt].charAt(pos), letterFrequency));
}
words[cnt] = builder.toString();
您可能还需要replaceAll
而不是replace
,但在进行StringBuilder
更改后,这无关紧要。
答案 1 :(得分:0)
你每次都要替换整个字符串,这意味着在你用a替换a之后再替换所有e次出现之后你就会重新编写原始的替换。
保持输入和输出字符串/数组分开。
另外请注意我假设输出是txt说话,因为看起来有6个单字母单词,好英语只有两个单字母单词a和我这可能会扭曲任何频率分析,或者表明Caeser cypher没用过。