方法字符串编码(String str)根据以下规则使用Switch语句编码String Str的内容



我正在尝试编写一种编码字符串内容的方法str根据以下规则:在"密码"一词中出现的str的字母应被该单词中的以下字母替换(即" c"变为" i"," i"变为" p",字母" r"应该变成" C"等(。T

我只是在尝试编译此代码时会遇到错误

不兼容的类型:java.lang.string不能转换为字符串

string.java:5:错误:找不到符号system.out.println(a.length(;。

public class NewString{
    public String encode(String str){
        for (int i = 0; i < str.length; i++){
            switch(str){
                case str.charAt(i) == "c":
                    str.replace("c", "i");
                    break;
                case str.charAt(i) == "i":
                    str.replace("i", "p");
                    break;
                case str.charAt(i) == "p":
                    str.replace("p", "h");
                    break;
                case str.charAt(i) == "h":
                    str.replace("h", "e");
                    break;
                case str.charAt(i) == "e":
                    str.replace("e", "r");
                    break;
                case str.charAt(i) == "r":
                    str.replace("r", "c");
                    break;
            }
        }
    return str;
    }
    public static void main(String[] args){
        NewString test = new NewString();
        String a = "cipher";
        System.out.println(test.encode(a));
    }
}
  1. str.length(),而不是str.lengthString具有方法length(),而不是字段length
  2. str.charAt(i) == 'c',而不是str.charAt(i) == "c"。两个操作数必须为char s才能使用=="c"String字面意思。'c'char字面。
  3. 您可能是指

    char currentChar = str.charAt(i);
    switch(currentChar) {
         case 'c':
             ...
             break;
    }
    
  4. str.replace("i", "p");str没有影响,您需要阅读结果。str = str.replace("i", "p");可能是您要寻找的。

您在这里滥用开关构造。看看下面的示例:

String newString = "";
for (int i = 0; i < str.length(); i++){
  switch(str.charAt(i)){
    case 'c':
      newStr = newStr + "i";
      break;
    ...
    default:
      newStr = newStr + str.charAt(i);
  }
}

在开关中,您要指定要与之比较的参数。在这种情况下,您想检查给定索引的字符。在情况下,您要指定要比较的值,在这种情况下,您的字母。请注意,这些是字符,它们是在单引号而不是双引号之间定义的。

然后,您的逻辑还有其他问题,例如,如果您的字符串是" CCC",则第一个迭代将创建" III",下一个迭代将创建" PPP",依此类推...我想创建一个新的字符串并以这种方式存储转换的字符。

您的方法有一些问题。

  • replace方法返回您忽略的String
  • case之后,您只能使用常数,但正在使用函数。此功能应移至switch部分。
  • String::replace一直在替换字符串中的所有出现,而不是索引中的出现。因此,结果不是预期的。
  • 当您的单词改变时会发生什么?您需要重写整个方法。我知道您正在描述一个特定情况,但是在现实世界中,您希望您的代码向扩展开放。

利用您的要求,我已经重新设计了您的代码:
Given a text and a encoding word
When a character of the word is found in the text
Then this character is replaced with the next character in the word, or the first if the this was the last character.

检查此实现:

public class StringEncoder {
    public static String encode(String stringToEncode, String encodingWord) {
        return stringToEncode.chars()
                .map(character -> getEncodedChar(encodingWord, (char) character))
                .collect(StringBuilder::new,
                        StringBuilder::appendCodePoint,
                        StringBuilder::append)
                .toString();
    }
    private static char getEncodedChar(String word, char character) {
        int i = word.indexOf(character);
        boolean characterInWord = i >= 0;
        if (characterInWord) {
            return nextChar(word, i);
        } else {
            return character;
        }
    }
    private static char nextChar(String word, int i) {
        return word.charAt((i + 1) % word.length());
    }
    public static void main(String[] args) {
        System.out.println(encode("cipher", "cipher"));
        System.out.println(encode("A text with cipher word", "cipher"));
        System.out.println(encode("love", "love"));
        System.out.println(encode("A text with love word", "love"));
    }
}

基于注释和其他答案,一种与您的代码类似的简单方法。

public class NewString {
    public String encode(String str){
        StringBuilder encodedString=new StringBuilder(str);
        for (int i = 0; i < str.length(); i++){
            char charToConvert=str.charAt(i);
            switch(charToConvert){
                case 'c':
                    encodedString.replace(i,i+1,"i");
                    break;
                case 'i':
                    encodedString.replace(i,i+1, "p");
                    break;
                case 'p':
                    encodedString.replace(i,i+1, "h");
                    break;
                case 'h':
                    encodedString.replace(i,i+1, "e");
                    break;
                case 'e':
                    encodedString.replace(i,i+1, "r");
                    break;
                case 'r':
                    encodedString.replace(i,i+1, "c");
                    break;
            }
        }
        return encodedString.toString();
    }
    public static void main(String[] args){
        NewString test = new NewString();
        String a = "cipher";
        System.out.println(test.encode(a));
    }
}

相关内容