我遇到了这个用来转换字符串的代码的问题....字符串没有在整个代码中更新......
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中输入了输入,尽管从我输入的字符串中正确读取了第一个和第二个字符。请帮助....
答案 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";