为什么我的代码不是我想要的结果?
why my code is not turn out the result that I want?
我想定义一个方法,输入一个字符串然后return一个字符串,其中的字符已经转换
public static String encode(String s){
char[] newArray = {'a','b','c','d','e','f','g','h','i','g','k','l','m'};
char[] newArray2 = {'n','o','p','q','r','s','t','u','v','w','s','y','z'};
for(int i=0; i<s.length();i++){
if(s.charAt(i) == newArray[i]){
s.replace(newArray[i], newArray2[i]);
}
}
return s;
}
public static void main(String[] args){
System.out.println(encode("firefly"));
}
但编译器只是 return 萤火虫,我知道 s.charAt(i) == newArray[i]
中存在问题,但是如何定义方法,例如,'f' 这个单个字符来搜索newArray,而不是如果 f 对应于 newArray 的第一个字符?还有当我只想用大写字母切换大写字母时如何定义它。那么如果我输入像 FireFly 这样的字符串,它会 return SverSyl?
因为replace
没有改变原来的String
。它 returns 一个新的 String
。你需要写
s = s.replace(newArray[i], newArray2[i]);
将修改后的String
赋值回变量s
。
在您的代码末尾,您将返回 s
,但它的值实际上并未更改。您需要为该变量分配其他内容,否则您将获得与输出相同的输入值。
首先,Java 中的字符串是不可变的。这意味着您无法更改它们。你能做的就是创造一个新的。其次,将您的字符串与翻译数组进行比较,以在同一索引处找到匹配项。在相同的位置很难找到匹配的,这不是你想要的。
您可以使用以下方法:
public static String encode(String s) {
StringBuffer b = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ((c >= 'a' && c <= 'm') || (c >= 'A' && c <= 'M')) {
b.append((char) ((int) c + 13));
continue;
}
if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z')) {
b.append((char) ((int) c - 13));
continue;
}
b.append(c);
}
return b.toString();
}
我们的想法是独立翻译每个字符并将其添加到字符串缓冲区。然后你 return 结果字符串。要在 'a' 和 'm' 之间转换一个字符,您只需将 13 添加到它的整数代码中。要在 'n' 和 'z' 之间转换一个字符,您只需从其整数代码中删除 13 即可。你对大写字母做同样的事情。
当我们用“FireFly 调用此方法时,您被取消得太早了”
public static void main(String args[]) {
System.out.println(encode("FireFly you were cancelled too soon"));
}
结果是:
SverSyl lbh jrer pnapryyrq gbb fbba
字符串是不可变的。所以从技术上讲,您需要创建一个新对象并为其分配一个引用。您可以将之前的字符串本身分配给它:
s = s.replace(newArray[i], newArray2[i]);
我想定义一个方法,输入一个字符串然后return一个字符串,其中的字符已经转换
public static String encode(String s){
char[] newArray = {'a','b','c','d','e','f','g','h','i','g','k','l','m'};
char[] newArray2 = {'n','o','p','q','r','s','t','u','v','w','s','y','z'};
for(int i=0; i<s.length();i++){
if(s.charAt(i) == newArray[i]){
s.replace(newArray[i], newArray2[i]);
}
}
return s;
}
public static void main(String[] args){
System.out.println(encode("firefly"));
}
但编译器只是 return 萤火虫,我知道 s.charAt(i) == newArray[i]
中存在问题,但是如何定义方法,例如,'f' 这个单个字符来搜索newArray,而不是如果 f 对应于 newArray 的第一个字符?还有当我只想用大写字母切换大写字母时如何定义它。那么如果我输入像 FireFly 这样的字符串,它会 return SverSyl?
因为replace
没有改变原来的String
。它 returns 一个新的 String
。你需要写
s = s.replace(newArray[i], newArray2[i]);
将修改后的String
赋值回变量s
。
在您的代码末尾,您将返回 s
,但它的值实际上并未更改。您需要为该变量分配其他内容,否则您将获得与输出相同的输入值。
首先,Java 中的字符串是不可变的。这意味着您无法更改它们。你能做的就是创造一个新的。其次,将您的字符串与翻译数组进行比较,以在同一索引处找到匹配项。在相同的位置很难找到匹配的,这不是你想要的。
您可以使用以下方法:
public static String encode(String s) {
StringBuffer b = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if ((c >= 'a' && c <= 'm') || (c >= 'A' && c <= 'M')) {
b.append((char) ((int) c + 13));
continue;
}
if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z')) {
b.append((char) ((int) c - 13));
continue;
}
b.append(c);
}
return b.toString();
}
我们的想法是独立翻译每个字符并将其添加到字符串缓冲区。然后你 return 结果字符串。要在 'a' 和 'm' 之间转换一个字符,您只需将 13 添加到它的整数代码中。要在 'n' 和 'z' 之间转换一个字符,您只需从其整数代码中删除 13 即可。你对大写字母做同样的事情。
当我们用“FireFly 调用此方法时,您被取消得太早了”
public static void main(String args[]) {
System.out.println(encode("FireFly you were cancelled too soon"));
}
结果是:
SverSyl lbh jrer pnapryyrq gbb fbba
字符串是不可变的。所以从技术上讲,您需要创建一个新对象并为其分配一个引用。您可以将之前的字符串本身分配给它:
s = s.replace(newArray[i], newArray2[i]);