Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法String encode(String str),它使用switch语句根据以下规则对String str的内容进行编码_Java_String_Switch Statement - Fatal编程技术网

Java 方法String encode(String str),它使用switch语句根据以下规则对String str的内容进行编码

Java 方法String encode(String str),它使用switch语句根据以下规则对String str的内容进行编码,java,string,switch-statement,Java,String,Switch Statement,我正在尝试编写一个方法,对字符串的内容进行编码 str根据以下规则:单词“cipher”中出现的str字母应分别替换为该单词中的以下字母,即“c”变成“i”,“i”变成“p”,字母“r”变成“c”,等等 我只是在编译这段代码时出错 不兼容的类型:java.lang.String无法转换为字符串 及 String.java:5:错误:找不到符号System.out.printlna.length 您在这里有点误用了switch结构。请看下面的示例: String newString = ""; f

我正在尝试编写一个方法,对字符串的内容进行编码 str根据以下规则:单词“cipher”中出现的str字母应分别替换为该单词中的以下字母,即“c”变成“i”,“i”变成“p”,字母“r”变成“c”,等等

我只是在编译这段代码时出错

不兼容的类型:java.lang.String无法转换为字符串

String.java:5:错误:找不到符号System.out.printlna.length


您在这里有点误用了switch结构。请看下面的示例:

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,等等。。。一个选项是创建一个新字符串,并以这种方式存储转换后的字符。

您在这里有点误用了switch结构。请看下面的示例:

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,等等。。。一个选项是创建一个新字符串,并以这种方式存储转换后的字符

是str.length,不是str.length。字符串具有方法长度,而不是字段长度。 这是str.charAti==c,不是str.charAti==c。两个操作数都必须是字符才能使用==。c是字符串文字c'是一个字符文本。 你可能是说

char currentChar = str.charAt(i);
switch(currentChar) {
     case 'c':
         ...
         break;
}
替换str.replacei,p;对str没有影响,您需要读取结果。str=str.replacei,p;可能就是你要找的

是str.length,不是str.length。字符串具有方法长度,而不是字段长度。 这是str.charAti==c,不是str.charAti==c。两个操作数都必须是字符才能使用==。c是字符串文字c'是一个字符文本。 你可能是说

char currentChar = str.charAt(i);
switch(currentChar) {
     case 'c':
         ...
         break;
}
替换str.replacei,p;对str没有影响,您需要读取结果。str=str.replacei,p;可能就是你要找的


你的方法有一些问题

replace方法返回一个被忽略的字符串。 在这种情况下,您只能使用常量,但正在使用函数。此功能应移到开关部分。 字符串::replace总是替换字符串中的所有引用,而不是索引中的引用。因此,结果也不是预期的结果。 你的话变了怎么办?您需要重写整个方法。我知道您正在描述一个特定的案例,但在现实世界中,您希望您的代码可以扩展。 利用您的要求,我重新编写了您的代码,以便: 给定一个文本和一个编码字 当在文本中找到单词的某个字符时 然后,该字符将替换为单词中的下一个字符,如果这是最后一个字符,则替换为第一个字符

检查此实现:

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"));
    }
}

你的方法有一些问题

replace方法返回一个被忽略的字符串。 在这种情况下,您只能使用常量,但正在使用函数。此功能应移到开关部分。 字符串::replace总是替换字符串中的所有引用,而不是索引中的引用。因此,结果也不是预期的结果。 你的话变了怎么办?您需要重写整个方法。我知道您正在描述一个特定的案例,但在现实世界中,您希望您的代码可以扩展。 利用您的要求,我重新编写了您的代码,以便: 给定一个文本和一个编码字 当在文本中找到单词的某个字符时 然后,该字符将替换为单词中的下一个字符,如果这是最后一个字符,则替换为第一个字符

检查此实现:

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));

    }
}

基于注释和其他答案,使用与代码类似的简单方法

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));

    }
}

关于第一个错误:您自己的类中是否有一个被命名为String?然后将拾取它,而不是标准类java.lang.String。给你的类起一个不同的名字,以确保它们不会混淆。你的方法会
即使使用当前的答案也不行,因为String在Java中是一个不可变的类。String.replace正在返回一个带有替换字符的新字符串,但您将忽略它。您正在将用作方法参数的字符串对象返回给方法。关于第一个错误:您自己的类中是否有一个被命名为String?然后将拾取它,而不是标准类java.lang.String。不要使用字符串,因为在当前的类中,使用字符串的方法是不可变的。String.replace正在返回一个带有替换字符的新字符串,但您将忽略它。您正在将用作方法参数的字符串对象返回给方法。