Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my code only replace certain characters with the string replace method?

Tags:

java

For my assignment, I have to write a code to encode/decode a message. I am near the end when I began to discover that whenever I type the message, the program only replaces certain characters. The translation is fairly simple, to encode, you change a to the opposite letter of the alphabet, so z. b to y, c to x, d to w, etc. The Assignment is as follows:

This project involves writing a program that encodes and decodes messages. The program should prompt the user to select whether a message is to be encoded or decoded and then prompts the user to enter the message. A blank space is used to separate each word in the message, and a period (.) is used to denote the end of a sentence. Separate methods must be used to encode and decode the input message. The coding scheme is very simple: the code equivalent for the letter A is Z, for B is Y, … , and for Z is A, as indicated in the following table. As an example, if the user chooses to encode a sentence like hello world, the encoded sentence would be svool dliow.

Here is my code:

import java.util.Scanner ;
public class Project1
{
  public static void main(String[] args)
  {
    Scanner input = new Scanner(System.in) ;

    //prompt user to decide to encode or decode

    System.out.print("Please enter 1 to encode, or 2 to decode the message: ") ;
    int promptNumber = input.nextInt() ;

    if (promptNumber == 1) {
      System.out.println("You have choosen to encode the message.") ;      
      System.out.print("Please enter the message you wish to be encoded: ") ;
      String encode = input.next();
      encode += input.nextLine();
      encode = encodeMessage(encode) ;
      System.out.println("Your encoded message is now: " + encode) ;
    }
    else if (promptNumber == 2) {
      System.out.println("You have choosen to decode the message.") ;
      System.out.print("Please enter the message you wish to decode: ") ;
      String decode = input.next();
      decode += input.nextLine();
      decode = decodeMessage(decode) ;
      System.out.println("Your encoded message is now: " + decode) ;
    }    
    else
      System.out.println("Please enter a value of 1 or 2.") ;
  }

  //method for encoded calculation

  public static String encodeMessage(String message)
  {
    String str = message ;
    for (int i = 0; i < str.length(); i++) {
      switch (str.charAt(i)) {
        case 'a': str = str.replace('a', 'z') ; break ;
        case 'b': str = str.replace('b', 'y') ; break ;
        case 'c': str = str.replace('c', 'x') ; break ;
        case 'd': str = str.replace('d', 'w') ; break ;
        case 'e': str = str.replace('e', 'v') ; break ;
        case 'f': str = str.replace('f', 'u') ; break ;
        case 'g': str = str.replace('g', 't') ; break ;
        case 'h': str = str.replace('h', 's') ; break ;
        case 'i': str = str.replace('i', 'r') ; break ;
        case 'j': str = str.replace('j', 'q') ; break ;
        case 'k': str = str.replace('k', 'p') ; break ;
        case 'l': str = str.replace('l', 'o') ; break ;
        case 'm': str = str.replace('m', 'n') ; break ;
        case 'n': str = str.replace('n', 'm') ; break ;
        case 'o': str = str.replace('o', 'l') ; break ;
        case 'p': str = str.replace('p', 'k') ; break ;
        case 'q': str = str.replace('q', 'j') ; break ;
        case 'r': str = str.replace('r', 'i') ; break ;
        case 's': str = str.replace('s', 'h') ; break ;
        case 't': str = str.replace('t', 'g') ; break ;
        case 'u': str = str.replace('u', 'f') ; break ;
        case 'v': str = str.replace('v', 'e') ; break ;
        case 'w': str = str.replace('w', 'd') ; break ;
        case 'x': str = str.replace('x', 'c') ; break ;
        case 'y': str = str.replace('y', 'b') ; break ;
        case 'z': str = str.replace('z', 'a') ; break ;
        case ' ': continue ;
        case '.': break ;
      }
    }
    return str ;
  }

  //method for decoded calculation

  public static String decodeMessage(String message)
  {
    String str = message ;
    for (int i = 0; i < str.length(); i++) {
      switch (str.charAt(i)) {
        case 'a': str = str.replace('a', 'z') ; break ;
        case 'b': str = str.replace('b', 'y') ; break ; //Error
        case 'c': str = str.replace('c', 'x') ; break ;
        case 'd': str = str.replace('d', 'w') ; break ; //Error
        case 'e': str = str.replace('e', 'v') ; break ;
        case 'f': str = str.replace('f', 'u') ; break ;
        case 'g': str = str.replace('g', 't') ; break ;
        case 'h': str = str.replace('h', 's') ; break ;
        case 'i': str = str.replace('i', 'r') ; break ;
        case 'j': str = str.replace('j', 'q') ; break ;
        case 'k': str = str.replace('k', 'p') ; break ;
        case 'l': str = str.replace('l', 'o') ; break ; //Error
        case 'm': str = str.replace('m', 'n') ; break ;
        case 'n': str = str.replace('n', 'm') ; break ;
        case 'o': str = str.replace('o', 'l') ; break ; 
        case 'p': str = str.replace('p', 'k') ; break ;
        case 'q': str = str.replace('q', 'j') ; break ;
        case 'r': str = str.replace('r', 'i') ; break ;
        case 's': str = str.replace('s', 'h') ; break ;
        case 't': str = str.replace('t', 'g') ; break ;
        case 'u': str = str.replace('u', 'f') ; break ;
        case 'v': str = str.replace('v', 'e') ; break ;
        case 'w': str = str.replace('w', 'd') ; break ;
        case 'x': str = str.replace('x', 'c') ; break ;
        case 'y': str = str.replace('y', 'b') ; break ; //Error
        case 'z': str = str.replace('z', 'a') ; break ;
        case ' ': continue ;
        case '.': break ;
      }
    }
    return str ;
  }
}
like image 402
Justin James Avatar asked Apr 10 '26 21:04

Justin James


1 Answers

It seems that you're iterating over your string by index, and instead of changing the current index, you're changing all occurrences of that particular value in that string, regardless if you have changed it, or still need to change it.

Let's clarify this with an example: "aba" with the following cypher: a => b, b => a

index 0: a => change all occurrences of a => result: bbb
index 1: b => change all occurrences of b => result: aaa
index 2: a => change all occurrences of a => result: bbb

while you clearly expected to shift every index only once. If we change this in your current code, using lets say an char[] to change the value in the current index, we get something like this:

public static String encodeMessage(String message) {
    char[] str = message.toCharArray();
    for (int i = 0; i < str.length; i++) {
        switch (str[i]) {
            case 'a':
                str[i] = 'z';
                break;
            case 'b':
                str[i] = 'y';
                break;
            case 'c':
                str[i] ='x';
                break;
            case 'd':
                str[i] ='w';
                break;
            case 'e':
                str[i] =  'v';
                break;
            case 'f':
                str[i] =  'u';
                break;
            case 'g':
                str[i] =  't';
                break;
            case 'h':
                str[i] =  's';
                break;
            case 'i':
                str[i] = 'r';
                break;
            case 'j':
                str[i] =  'q';
                break;
            case 'k':
                str[i] =  'p';
                break;
            case 'l':
                str[i] =  'o';
                break;
            case 'm':
                str[i] =  'n';
                break;
            case 'n':
                str[i] =  'm';
                break;
            case 'o':
                str[i] = 'l';
                break;
            case 'p':
                str[i] = 'k';
                break;
            case 'q':
                str[i] = 'g';
                break;
            case 'r':
                str[i] =  'i';
                break;
            case 's':
                str[i] =  'h';
                break;
            case 't':
                str[i] = 'g';
                break;
            case 'u':
                str[i] = 'f';
                break;
            case 'v':
                str[i] = 'e';
                break;
            case 'w':
                str[i] =  'd';
                break;
            case 'x':
                str[i] = 'c';
                break;
            case 'y':
                str[i] = 'b';
                break;
            case 'z':
                str[i] = 'a';
                break;
            case ' ':
                continue;
            case '.':
                break;
        }
    }
    return new String(str);
}

et voila:

Your encoded message is now: svool dliow

like image 59
skubski Avatar answered Apr 12 '26 10:04

skubski