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

时间:2015-02-21 22:35:22

标签: java arrays replace

我想定义一个输入字符串的方法然后返回一个字符串,其中的字符已被转换

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

}

但是编译器只返回firefly,我知道s.charAt(i) == newArray[i]中存在问题,但是如何定义方法,例如&#39; f&#39;这个单一的char来搜索newArray,而不是如果f对应newArray的第一个char?当我想要大写字母开关只用大写时,如何定义它。那么如果我输入像FireFly这样的字符串,它会返回SverSyl吗?

4 个答案:

答案 0 :(得分:2)

因为replace没有更改原始String。它返回一个新的String。你需要写

s = s.replace(newArray[i], newArray2[i]);

将修改后的String分配回变量s

答案 1 :(得分:1)

首先,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();
}

这个想法是你独立翻译每个字符并将其添加到字符串缓冲区。然后返回结果字符串。要在'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

答案 2 :(得分:1)

字符串是不可变的。因此,从技术上讲,您需要创建一个新对象并为其指定引用。您可以将之前的字符串本身分配给它:

s = s.replace(newArray [i],newArray2 [i]);

答案 3 :(得分:0)

在代码的最后,您将返回s,但它的值实际上并未更改。您需要为该变量分配其他内容,否则您将获得与输出相同的值。