2015-06-21 4 views
-1

Итак, в основном я пытаюсь заменить все символы в сообщении, которое будет вводиться пользователем. Например, если пользователь вводит «собаку» и вводит кодовый номер «4», то новое сообщение будет «hsk». d, e, f, g, h, то же, что и o, p, q, r, s. Вот мой код:Заменить символ в сообщении

import java.util.*; 

public class Lab6 { 
    public static void main(String[] args) { 

    int codeNum; 
    String msg; 

    Scanner in = new Scanner(System.in); 
    Scanner read = new Scanner(System.in); 

    System.out.println("Please enter a message"); 
    msg = read.nextLine(); 
    System.out.println("Please enter a value for coding"); 
    codeNum = in.nextInt(); 

    System.out.println("New message = " + getMsg(msg, codeNum)); 

    } 

    public static String getMsg(String msg, int codeNum) { 

    char[] Upper_Case_Array = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; 
    char[] Lower_Case_Array = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'l', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 
    char[] digArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    char[] charArray = msg.toCharArray(); 


    for (int i = 0; i <= charArray.length; i++) { 
     if (charArray[i] == ' ') { 
      continue; 
     } 
     for (int j = 0; j <= Upper_Case_Array.length; j++) { 
      if (charArray[i] == Upper_Case_Array[j]) { 
       charArray[i] = Upper_Case_Array[j + codeNum]; 
      } 
     } 
     for (int h = 0; h <= Lower_Case_Array.length; h++) { 
      if (charArray[i] == Lower_Case_Array[h]) { 
       charArray[i] = Lower_Case_Array[h + codeNum]; 
      } 
     } 

     for (int u = 0; u <= digArray.length; u++) { 
      if (charArray[i] == digArray[u]) { 
       charArray[i] = digArray[u + codeNum]; 
      } 
     } 

    } 
    return new String(charArray); 
    } 
} 

Это попросить пользователя ввести сообщение и номер кода, но после того, что я получаю

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 26 at Lab6.getMsg(Lab6.java:39) at Lab6.main(Lab6.java:22)

Как мне это исправить?

+0

Надеюсь, ваши проблемы домашние идут хорошо. Проблема в том, что вы поднимаетесь за верхний конец массива. Как настроить индекс [i], чтобы он не переполнял массив? (Что должен делать компьютер для «z»?) – Barett

+0

спасибо, я думаю, я знаю, что делать сейчас =] – InvalidUserName

ответ

0

Если вы понимаете, код ASCII для ваших входов:

'0' - '9' = 48 - 57 
'A' - 'Z' = 65 - 90 
'a' - 'z' = 97 - 122 
// All other characters are not affected by the code number 

Тогда вы будете знать, что после добавления номера кода до значения ASCII символа возможно, вы можете передать максимальное значение «9» , 'Z' или 'z', и вы захотите вернуться к «0», «A» или «a».

Если вы знаете это, то можете просто указать свой getMsg() и не беспокоиться о наличии массивов прописных или строчных букв или цифр; и вам не нужно делать столько циклов. Что-то вроде следующего:

public static void main(String[] args) throws Exception { 
    Scanner input = new Scanner(System.in); 

    System.out.print("Please enter a message: "); 
    String message = input.nextLine(); 
    System.out.print("Please enter a value for coding: "); 
    int codeNumber = input.nextInt(); 

    System.out.println(getMsg(message, codeNumber)); 
} 

public static String getMsg(String message, int codeNumber) { 
    char[] characters = message.toCharArray(); 

    for (int i = 0; i < characters.length; i++) { 
     for (int j = 0; j < codeNumber; j++) { 
      int charCode = characters[i] + 1; 
      // Only apply the modification to letters or numbers 
      if (Character.isUpperCase(characters[i])) { 
       characters[i] = charCode > 'Z' ? 'A' : (char)charCode; 
      } else if (Character.isLowerCase(characters[i])) { 
       characters[i] = charCode > 'z' ? 'a' : (char)charCode; 
      } else if (Character.isDigit(characters[i])) { 
       characters[i] = charCode > '9' ? '0': (char)charCode; 
      } 
     } 
    } 
    return new String(characters); 
} 

Результаты:

Please enter a message: dog zebra 7890 
Please enter a value for coding: 4 
hsk difve 1234 
+0

Спасибо! Что означают символы "[i] = charCode> 'Z'? 'A': (char) charCode; "" эта строка означает? и как я могу напечатать двоичное представление для этих букв. Ex. 010001010100011001000111 wuld be EFG после кодирования ABC – InvalidUserName

+0

@InvalidUserName characters [i] = charCode> 'Z'? 'A': (char) charCode; является тройной операцией принятия решения о назначении 'A' элементу, если модифицированный charCode прошел 'Z', иначе модифицированный charCode присваивается элементу после его возврата обратно в символ. Это то, что позволяет символам обертываться до начала, как показывает мой ответ. – Shar1er80

+0

@InvalidUserName Для двоичного вывода посмотрите Integer.toBinaryString(), но имейте в виду, что символы ASCII имеют длину всего семь бит, поэтому вам нужно будет оставить нуль нулями, если вы хотите 8 бит. – Shar1er80

0

Замените метод getMsg(), если этот код

public static String getMsg(String msg, int codeNum) { 

      char[] Upper_Case_Array = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; 
      char[] Lower_Case_Array = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'l', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; 
      char[] digArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
      char[] charArray = msg.toCharArray(); 

      for (int i=0; i<charArray.length; i++) { 
       int newIndex = 0; 
       if (getIndex(Upper_Case_Array, charArray[i]) != -1) { 
        newIndex = i + codeNum; 
        if (newIndex >= Upper_Case_Array.length) { 
         newIndex = newIndex - Upper_Case_Array.length ; 
        } 
        charArray[i] = Upper_Case_Array[newIndex]; 
       } else if (getIndex(Lower_Case_Array, charArray[i]) != -1) { 
        newIndex = i + codeNum; 
        if (newIndex >= Lower_Case_Array.length) { 
         newIndex = newIndex - Lower_Case_Array.length ; 
        } 
        charArray[i] = Lower_Case_Array[newIndex]; 
       } else if (getIndex(digArray, charArray[i]) != -1) { 
        newIndex = i + codeNum; 
        if (newIndex >= digArray.length) { 
         newIndex = newIndex - digArray.length ; 
        } 
        charArray[i] = digArray[newIndex]; 
       }  
      } 

      return new String(charArray); 
     } 

     public static int getIndex(char[] source, char filter) { 
      int result = -1; 
      for (int i=0; i<source.length; i++) { 
       if (source[i] == filter) { 
        result = i; 
        break; 
       } 
      } 
      return result; 
     } 
1

Это звучит мне, как это граничная задача. Итак, что вы должны делать в этом случае, бережно относится к границам массива. Ну, по-видимому, у вас есть такие строки в коде:

charArray[i] = Upper_Case_Array[j + codeNum]; 

и

charArray[i] = Lower_Case_Array[h + codeNum]; 

и

charArray[i] = digArray[u + codeNum]; 

Давайте рассмотрим последний пример. Таким образом, u 24 будет вызывать проблемы, потому что 24 + 4 составляет 28, что больше 26 (Поскольку 26 букв в английском алфавите, я не считал ваш массив, а просто предполагал). Возможно, вам придется дать явный контроль для каждого цикла цикла, чтобы этого не произошло.

Но я предлагаю вам, с другой стороны, символы целыми числами, поэтому просто добавьте целочисленное значение (codeNum) к символу, который у вас есть, и у вас есть новые символы, просто выполнив эту операцию. Я не знаю, есть ли правила, которые вы не можете использовать, но это должно быть сработано. Таким образом, вы можете использовать эту строку:

chararray[i] = charArray[i] + 4; 

Надеюсь, что это поможет.

+0

спасибо!Кстати, я только что узнал, что забыл упомянуть, если он пройдет 26, тогда он вернется к началу. Ex, 24 + 4 = 28, 26 - «z», затем возвращается к 1, 2, поэтому ans будет «b». lol – InvalidUserName

+0

В этом случае используйте эту линию по модулю 26 (% 26). Надеюсь, это поможет вам. Ofc, не проблема :) –

Смежные вопросы