如何在字符串中切换字母

时间:2018-06-10 20:02:30

标签: java string

我正在处理一个项目,问题是要求我在数组中切换特定的字母。例如,a到z,b到y,c到x等......

我写了这个:

import java.util.Scanner;
public class Project1
{
public static void main( String [] args )
{
    System.out.println("This program helps to encode or decode some text, the concept is that an A turns into a Z, B into a Y etc.");
    Scanner reader = new Scanner ( System.in );
    System.out.print("What is your message (encoded or not): ");
    String Sentence = reader.nextLine();

    System.out.println();

    System.out.print("Press 1 to encode and 2 to decode: ");
    int Number = reader.nextInt();

    if ( Number == 1)
    {
        Encode (Sentence);
    }
    else if ( Number == 2)
    {
        Decode (Sentence);
    }   
    else
    {
        System.out.println("The number has to be 1 or 2.");
    }
}

public static void Encode (String a)
{
    a = a.replace( 'a' , 'z' );
    a = a.replace( 'b' , 'y' );
    a = a.replace( 'c' , 'x' );
    a = a.replace( 'd' , 'w' );
    a = a.replace( 'e' , 'v' );
    a = a.replace( 'f' , 'u' );
    a = a.replace( 'g' , 't' );
    a = a.replace( 'h' , 's' );
    a = a.replace( 'i' , 'r' );
    a = a.replace( 'j' , 'q' );
    a = a.replace( 'k' , 'p' );
    a = a.replace( 'l' , 'o' );
    a = a.replace( 'm' , 'n' );
    a = a.replace( 'n' , 'm' );
    a = a.replace( 'o' , 'l' );
    a = a.replace( 'p' , 'k' );
    a = a.replace( 'q' , 'j' );
    a = a.replace( 'r' , 'i' );
    a = a.replace( 's' , 'h' );
    a = a.replace( 't' , 'g' );
    a = a.replace( 'u' , 'f' );
    a = a.replace( 'v' , 'e' );
    a = a.replace( 'w' , 'd' );
    a = a.replace( 'x' , 'c' );
    a = a.replace( 'y' , 'b' );
    a = a.replace( 'z' , 'a' );
    System.out.println("Encoded message is: " + a);
}

public static void Decode ( String s)
{
    s = s.replace( 'z' , 'a' );
    s = s.replace( 'y' , 'b' );
    System.out.println("Decoded message is: " + s);
}

}

然而,当我用一个单词输入一个单词时,它变成了一个z,然后又变成了一个又一个单词。我想知道是否还有其他方法可以从一个字母切换到另一个字母,这样问题就不会再发生了。

5 个答案:

答案 0 :(得分:7)

我认为最简单的方法是遍历String,逐个更改每个字符。在char[]中执行此操作可能最简单,您可以在最后转换回String

此外,您不需要单独的encodedecode方法,因为String的编码和解码完全相同。

public String encode(String toEncode) {
    char[] characters = toEncode.toCharArray();
    for (int index = 0; index < characters.length; index++) {
        if (characters[index] >= 'a' && characters[index] <= 'z') {
            characters[index] = (char)('a' + 'z' - characters[index]);
        }
    }
    return new String(characters);
}

请注意中间的char算术,将a转换为z,将b转换为y,依此类推。 if条件可确保您不会替换任何非小写字母的字符。

答案 1 :(得分:4)

将字符串转换为char数组或StringBuilder。迭代字符。对于每个char,执行必要的替换,然后继续执行下一个char。通过这种方式,您可以确保不会将替换替换回原来的替代。

答案 2 :(得分:0)

所以问题是,如果你一次更换一个,你最终会用以后的更改替换先前编辑的结果。我建议遍历字符串并根据需要交换我们的每个字符。

import java.util.HashMap;
public char hotSwap(char c){
     Map<Character, Character> swaps = new HashMap<Character, Character>();
     // add all the chars to the map...
     if(swaps.containsKey(c)){
          return(swaps.get(c));
     }else{
          return(c);
     }
}
String myString = "what ever the string needs to be...";
for(int k = 0 ; k < myString.length; k++){
      myString.setCharAt(k,  hotSwap(myString.charAt(k));
}

答案 3 :(得分:0)

您不需要当前使用的各种表格,而是可以在编码/解码时将字符“a”中的正确偏移量计算为整数值。并且,如果您返回已编码/解码的值,则更容易测试。因此,使用StringBuilder(它的可变,与String不同)。像,

public static String encode(String s) {
    StringBuilder sb = new StringBuilder(s);
    for (int i = 0; i < sb.length(); i++) {
        char ch = sb.charAt(i);
        int d = ch - 'a';
        sb.setCharAt(i, (char) ('z' - d));
    }
    return sb.toString();
}

public static String decode(String s) {
    StringBuilder sb = new StringBuilder(s);
    for (int i = 0; i < sb.length(); i++) {
        char ch = sb.charAt(i);
        int d = ch - 'a';
        sb.setCharAt(i, (char) ('z' - d));
    }
    return sb.toString();
}

然后测试它

String e = encode("hello");
System.out.printf("%s = %s%n", e, decode(e));

我得到了

svool = hello

答案 4 :(得分:0)

这可能不是最佳解决方案,但至少没有重复。

public static String encode(String input) {
    char [] listChar = input.toCharArray();
    for(int i = 0; i <listChar.length; i++) {
        switch(listChar[i]) {
             case 'a' : listChar[i] = 'z';
                        break;
                  /** ToDo */      
        }
    }
    input = String.valueOf(listChar);

    return input;
}