为什么我的代码不是我想要的结果?

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