二维数组的频率计数

时间:2014-03-18 16:45:27

标签: java arrays multidimensional-array

我正在尝试进行vigenere密码攻击。我有一个密码长度未知的加密文本。我正在解决找到密钥长度的算法(我在块上分割文本,我在计算巧合指数)。 为了计算频率,我使用了哈希映射。但现在我有2维数组,毕竟我的地图是空的,帮我找到我的问题,谢谢:)尽管我得到了像{}这样的东西。 这是我的代码:

public static String count_coincidence (char[][] text){
    int p=0;
    HashMap<Character,Double> map = new HashMap<Character,Double>();
    int a =(int)('а');
    char[] dictionary = new char[32];
    for(int x=0;x<dictionary.length;x++){
        dictionary[x]=((char)(a+x));
    }
    for(int i=0;i<text.length;i++){
        for(int j=0;j<text.length;j++){
            for(int l=0;l<text.length;l++){

                if(text[i][j]==dictionary[l]){
                    char c = text[i][j];
                    Double val = map.get(new Character(c));
                    if(val != null){
                        map.put(c, new Double( (val + 1) ) );
                    }
                    if(val==null){
                        map.put(c,1.0);
                    }
                }
            }


        }
    }

    String d=map.toString();
    return d;
}

在循环内的每次迭代之后,我应该保存map的值。

1 个答案:

答案 0 :(得分:0)

您的循环索引都是错误的。你有:

for(int i=0;i<text.length;i++){
    for(int j=0;j<text.length;j++){
        for(int l=0;l<text.length;l++){
            if(text[i][j]==dictionary[l]){

你想:

for(int i=0;i<text.length;i++){
    for(int j=0;j<text[i].length;j++){
        for(int l=0;l<dictionary.length;l++){
            if(text[i][j]==dictionary[l]){

如果您打算迭代数组的整个内容,则需要确保索引达到要迭代的数组的大小。

  • text[i]范围内的[0, text.length)
  • text[i][j]范围内的
  • j是[0, text[i].length)
  • l dictionary[l]范围内的[0, dictionary.length)