方法不更新原始字符串变量

时间:2014-01-28 08:51:45

标签: java string parameters

我遇到了这个用来转换字符串的代码的问题....字符串没有在整个代码中更新......

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PigLatin {
private static String str = "pig";
private char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
private Character firstChar, secondChar;

public void inputString(String str) {
    try {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader input = new BufferedReader(isr);
        str = input.readLine();
    } catch (Exception e) {
        // TODO: handle exception
        System.out.println("unable to input String");
        e.printStackTrace();
    }
    firstChar = str.charAt(0);
    secondChar = str.charAt(1);
    System.out.println(firstChar);
    System.out.println(secondChar);
}

public static void main(String[] args) {
    PigLatin pl = new PigLatin();
    System.out.println("Enter an english word to convert to PigLatin");
    pl.inputString(str);
    System.out.println(str);
    pl.convert(str);
}

public void convert(String lowerCase) {
    // TODO Auto-generated method stub
    System.out.println("Original string:" + str);
    if (isVowel())
        str.concat("yay");
    else {
        String suffix = firstChar.toString() + "ay";
        // String suffix = String.valueOf(str.charAt(0))+"ay";
        str = str.substring(1) + suffix;
    }
    System.out.println("PigLatin:" + str);

}

public boolean isVowel() {
    // TODO Auto-generated method stub
    for (char ch : vowels) {
        if (firstChar.equals(ch)) {
            if (firstChar.equals('v') && secondChar.equals('q'))
                return false;
            return true;
        }
        if (firstChar.equals('y') && !secondChar.equals(ch))
            return true;
    }
    return false;
}
    }

输出如下: 输入英文单词转换为PigLatin

风筝

k“第一个字符”

我是“第二个角色”

原始字符串:pig

PigLatin:igkay

为什么字符串没有被更新,即使我在命令行evn中输入了输入,尽管从我输入的字符串中正确读取了第一个和第二个字符。请帮助....

4 个答案:

答案 0 :(得分:4)

if (isVowel())
        str.concat("yay");

java中的字符串不可变,因此您必须更新str

if (isVowel())
        str = str.concat("yay");

如果您不想每次都重新分配str,可以将str声明为StringBuilder并通过append方法进行更新:

private static StringBuilder str = new StringBuilder("pig");

//other code...

public void convert(String lowerCase) {
    //other code...
    if (isVowel())
        str.append("yay"); // this will modify the current object, as it is 
                           // a StringBuilder and not a string
    //other code...
}

答案 1 :(得分:0)

str.concat("yay")

应该是

str = str.concat("yay")或速记str += "yay"

因为字符串在Java中是不可变的。这意味着它们的价值无法改变。

答案 2 :(得分:0)

pl.inputString(str);

以上陈述不会改变pl.str,因此pl.str = pig

pl.convert(str);

执行下面的代码('kite'作为输入)

String suffix = firstChar.toString() + "ay";  // result = kay
str = str.substring(1) + suffix; // str=pig, hence ig + kay = igkay

上面的代码不会在inputString()

中重新分配pl.str

更新:(与评论相同)
静态或实例变量在您的代码中无关紧要,因为在方法inputString(String str)中,您要分配在参数中传递的局部变量,而不是静态变量str。

由于Java是按值传递的,因此pl.inputString(str)将导致引用副本。您正在重新分配该方法中的本地引用。这意味着local-reference str和PigLatin.str引用是不同的并且引用不同的对象。要更新PigLatin.str,不能更改字符串对象值,因为它是不可变的。请改用StringBuilder,并在inputString(str)

中指定相同的名称

答案 3 :(得分:-1)

if(isVowel())

    str.concat("yay");

您可以将其更改为..

if(isVowel())

     str=str+"yay";