用for循环替换字符串中的字母

时间:2014-05-20 09:04:12

标签: java

我目前正在尝试遍历一个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;

2 个答案:

答案 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没用过。