Beginner
Beginner

Reputation: 143

Caesar Cipher (List of Frequencies)

I'm dealing with Caesar Cipher problem and so far all my test cases work, however my problems come when dealing with the list of frequencies. Any help would be appreciated !

    public class CaesarCipher 
    {
    //Percentage frequencies for alphabet
    static double[] table = {8.2, 1.5, 2.8, 4.3, 12.7, 2.2, 2.0, 6.1, 7.0, 0.2, 0.8, 4.0, 2.4, 6.7,
                7.5, 1.9, 0.1, 6.0, 6.3, 9.1, 2.8, 1.0, 2.4, 0.2, 2.0, 0.1};

    //convert letter to number
    static int let2nat(char c)
    {
        return ((int) c) - 97;
    }

    //convert number to letter
    static char nat2let(int code)
    {
        return (char) (code + 97);
    }

    //shift a letter to another letter
    static char shift(int shftAmt, char c)
    {
        if (let2nat(c) < 0 || let2nat(c) > ((int) ('z' - 'a') + 1) - 1) 
        {
            return c;
        } 
        else 
        {
            // do a safe shift
            int result = (let2nat(c) + shftAmt) % ((int) ('z' - 'a') + 1);
            result += ((int) ('z' - 'a') + 1);
            result %= ((int) ('z' - 'a') + 1);
            return nat2let(result);
         }
    }

    //encodes a string using the given shift amount
    static String encode(int shftAmt, String str)
    {
      char[] encodedStr = new char[str.length()];
      for(int i = 0; i < str.length(); i++)
      {
          encodedStr[i] = shift(shftAmt, str.charAt(i));
      }

      return new String(encodedStr);
    }

    //performs the inverse method to encode
    static String decode(int shftAmt, String str)
    {
      char[] decodedStr = new char[str.length()];
      for(int i = 0; i < str.length(); i++)
      {
          decodedStr[i] = shift(0 - shftAmt, str.charAt(i));
      }

      return new String(decodedStr);
    }

    //Calculates the amount of lowercase letters
    static int lowers(String str)
    {
      int count = 0;
      for(int i = 0; i < str.length(); i++)
      {
          if(let2nat(str.charAt(i)) >= 0 && let2nat(str.charAt(i)) <= 25)
              count++;
      }

      return count;
    }

    //Calculates the number of times a character appears in a string
    static int count(char c, String str)
    {
      int counter = 0;
      for(int i = 0; i < str.length(); i++)
      {
          if(c == str.charAt(i))
              counter++;
      }
      return counter;
    }

    //Calculates the percentage of one integer to another
    static double percent(int num1, int num2)
    {
      return ((float) num1/num2 * 100);
    }

    //Returns the list of percentage frequencies 
    static double[] freqs(String str)
    {
      double[] count = new double[26];
      for(int i = 0; i < str.length(); i++)
          if(let2nat(str.charAt(i)) >= 0 && let2nat(str.charAt(i)) <= 25)
              count[let2nat(str.charAt(i))]++;
      for(int i = 0; i < 26; i++)
          count[i] = percent((int)count[i], lowers(str));
      return count;
    }
}

Above is my code so far, up until figuring out the frequencies..my current output is [D@2a139a55when doing the following System.out.println(freqs("haskellisfun"));

when the output for the following method should be:

that returns the list of percentage frequencies of each of the lower-case letters
’a’ to ’z’ in a string of characters. For example:
freqs("haskellisfun") ->
{8.33333,0.0,0.0,0.0,8.33333,8.33333,0.0,8.33333,
8.33333,0.0,8.33333,16.6667,0.0,8.33333,0.0,0.0,
0.0,0.0,16.6667,0.0,8.33333,0.0,0.0,0.0,0.0,0.0}

Any help would be appreciated, just can't find my error.

Upvotes: 0

Views: 548

Answers (1)

Will
Will

Reputation: 491

What's being printed is the type and hashcode of the array. ([D@2a139a55 means "double array with hashcode 2a139a55")

You can print the array with Arrays.toString() like this:

import java.util.Arrays;
System.out.println(Arrays.toString(freqs("haskellisfun")));

Upvotes: 2

Related Questions