我正在处理一个项目,问题是要求我在数组中切换特定的字母。例如,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,然后又变成了一个又一个单词。我想知道是否还有其他方法可以从一个字母切换到另一个字母,这样问题就不会再发生了。
答案 0 :(得分:7)
我认为最简单的方法是遍历String
,逐个更改每个字符。在char[]
中执行此操作可能最简单,您可以在最后转换回String
。
此外,您不需要单独的encode
和decode
方法,因为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;
}