-3

Extremely close to having this task finished but can't see which part of this is holding me back. If anybody could put me on the right track I'd be very thankful. the following is the error code that eclipse gives me each time I try to run this.

**Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2

at lab01.EncodeDecode.backMap(EncodeDecode.java:162)

at lab01.EncodeDecode.Decode(EncodeDecode.java:68)

at lab01.EncodeDecode.(EncodeDecode.java:26)

at lab01.EncodeDecodeTester.main(EncodeDecodeTester.java:14)**

 package lab01;
import java.util.*;
/**
 * 
 * @author David Bierbrauer, 
 *
 */
public class EncodeDecode 
{
    //method declaration
    static String[] originalList,encodedList,decodedList;
    static int total;

    public EncodeDecode(String[] oL) 
    {

        //instance variable declaration
        total = oL.length;
        originalList = new String[total];
        encodedList = new String[total];
        decodedList = new String[total];
        originalList = oL;


        encodedList= Encode(originalList);      
        decodedList = Decode(encodedList);
    }

    public static String[] Encode (String[] originalList)
    {
        //declare control variables
        String currentWord = "", codedWord = "";
        char currentChar = ' ';
        int i = 0, j = 0, stringLength = 0;


        for (i=0; i < total ; i++)
        {
            currentWord = originalList[i];
            stringLength = currentWord.length();

            for (j = 0; j < stringLength; j++)
            {
                currentChar = currentWord.charAt(j);
                codedWord = codedWord +forwardMap(currentChar);
            }

            encodedList[i] = codedWord;
            codedWord = "";
        }
        return encodedList;
    }

    public static String[] Decode (String[] encodedList) 
    {
        String currentWord = "", encodedWord = "";
        char currentChar = ' ';
        int i =0, j=0, stringLength = 0;

        for(i = 0; i < total; i++)
        {
            currentWord = encodedList[i];
            stringLength = currentWord.length();

            for(j = 0; j < stringLength; j++)
            {
                currentChar = currentWord.charAt(j);
                encodedWord = encodedWord + backMap(currentChar);
            }

            decodedList[i] = encodedWord;
            encodedWord = "";
        }
        return decodedList;
    }

    public static char forwardMap(char currentChar)
    {
        char newChar = ' ';
        int i = 0;

        String encodeMapUpper = "CDEFGHIJKLMNOPQRSTUVWXYZAB";
        String encodeMapLower = "cdefghijklmnopqrstuvwxyzab";
        String encodeMapNumber = "2345678901";

        char [] encodeArrayUpper = encodeMapUpper.toCharArray();
        char [] encodeArrayLower = encodeMapLower.toCharArray();
        char [] encodeArrayNumber = encodeMapNumber.toCharArray();

        if(encodeMapUpper.indexOf(currentChar) != -1)
        {
            for( i = 0; i < encodeArrayUpper.length; i++)
            {
                if(currentChar == encodeArrayUpper[i])
                {
                    newChar = encodeArrayUpper[(i+2) % 26];
                }
            }
        }

        else if(encodeMapLower.indexOf(currentChar) != -1)
        {
            for( i = 0; i < encodeArrayLower.length; i++)
            {
                if(currentChar == encodeArrayLower[i])
                {
                    newChar = encodeArrayLower[(i+2) % 26];
                }
            }
        }

        else if(encodeMapNumber.indexOf(currentChar) != -1)
        {
            for( i = 0; i < encodeArrayNumber.length; i++)
            {
                if(currentChar == encodeArrayNumber[i])
                {
                    newChar = encodeArrayNumber[(i+2) % 10];
                }

            }
        }
        else
        {
            //element is a special character
            newChar = currentChar;
        }

        return newChar;
    }

    public static char backMap(char currentChar)
    {
        char newChar = ' ';
        int i = 0;

        String decodeMapUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String decodeMapLower = "abcdefghijklmnopqrstuvwxyz";
        String decodeMapNumber = "0123456789";

        char[] decodeArrayUpper = decodeMapUpper.toCharArray();
        char[] decodeArrayLower = decodeMapLower.toCharArray();
        char[] decodeArrayNumber = decodeMapNumber.toCharArray();

        if (decodeMapUpper.indexOf(currentChar) != -1)
        {
            for (i=0; i < decodeArrayUpper.length; i++)
            {
                if (currentChar == decodeArrayUpper[i])
                {
                    newChar = decodeArrayUpper[(i - 2) % 26];
                }
            }
        }

        else if(decodeMapLower.indexOf(currentChar) != -1)
        {
            for (i=0; i < decodeArrayLower.length; i++)
            {
                if (currentChar == decodeArrayLower[i])
                {
                    newChar = decodeArrayLower[(i - 2) % 26];
                }
            }
        }

        else if(decodeMapNumber.indexOf(currentChar) != -1)
        {
            for (i=0; i < decodeArrayNumber.length; i++)
            {
                if (currentChar == decodeArrayNumber[i])
                {
                    newChar = decodeArrayNumber[(i - 2) % 10];
                }
            }
        }   

        else
        {
            newChar = currentChar;
        }
        return newChar;
    }
    //get methods
    public String[] getEncodedList() { return encodedList;}
        public String[] getDecodedList() { return decodedList;}

}

This is the tester class bellow just in case.

package lab01;

public class EncodeDecodeTester 
{
    public static void main(String[] args)
    {
        EncodeDecode testEncoder;
        int x = 0;
        String[] output = new String[5];
        String[] oL = new String[] {"catdog","24","keys","Duck","PIZZA!"};


        //create encoder
        testEncoder = new EncodeDecode(oL);

        System.out.println("Encoded list:");
        for( x = 0; x < output.length; x++)
        {
            output = testEncoder.getEncodedList();
            System.out.println(output[x]);
        }

        System.out.println();
        System.out.println("Decoded List:");
        for(x = 0; x < output.length; x++)
        {
            output = testEncoder.getDecodedList();
            System.out.println(output[x] + " ");
        }
        System.out.println();

        System.out.println("End");
    }
}

Please help I am completely lost for words on what I did wrong here.

David
  • 11
  • 3
  • Did you debug your code? – Jeroen Heier Jan 30 '18 at 05:02
  • I took a look at the other question you linked but i'm still lost. It seems like that guy is trying to do an entirely different thing then I am because everyone who is helping him never talked about the encoding using an offset. Not really seeing any similarities between our objectives so IDK if I would say that this has been asked before. he's basically asking how to print a word with one character on each line. Im trying to encode and decode a string. I do not see how those two questions are the same. – David Jan 30 '18 at 15:00

1 Answers1

1

The Java % operator doesn't always produce a number between 0 and the second operand. Replace (i - 2) % 26 (which can produce -2) with (i + 24) % 26 and similarly in other places.

Ted Hopp
  • 232,168
  • 48
  • 399
  • 521