Java 方法String encode(String str),它使用switch语句根据以下规则对String str的内容进行编码
我正在尝试编写一个方法,对字符串的内容进行编码 str根据以下规则:单词“cipher”中出现的str字母应分别替换为该单词中的以下字母,即“c”变成“i”,“i”变成“p”,字母“r”变成“c”,等等 我只是在编译这段代码时出错 不兼容的类型:java.lang.String无法转换为字符串 及 String.java:5:错误:找不到符号System.out.printlna.lengthJava 方法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
您在这里有点误用了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正在返回一个带有替换字符的新字符串,但您将忽略它。您正在将用作方法参数的字符串对象返回给方法。