注意:我必须为此程序使用StringTokenizer(它用于作业)
我正在尝试将此字符串“Java Programming”。说“J @ v @ ~~~ Progr @mming。”使用StringTokenizer。
我遇到以下代码的2个问题......
我缺少什么?我浏览了Java的API文档,无法弄明白。
import java.util.StringTokenizer;
public class StringToken {
private String token;
//Constructor with default text
public StringToken() {
token = "Java Programming.";
}
//Constructor with custom text
public StringToken(String newToken) {
token = newToken;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String encodeTokenA(String newToken){
StringTokenizer st = new StringTokenizer(newToken, "a");
while (st.hasMoreTokens()){
String token = st.nextToken();
System.out.format(token + "@");
}
return token;
}
public String encodeTokenB(String newToken){
StringTokenizer st = new StringTokenizer(newToken, " ");
while (st.hasMoreTokens()){
String token = st.nextToken();
System.out.format(token + "~~~");
}
return token;
}
}
public class TestStringToken {
public static void main(String[] args) {
StringToken test = new StringToken();
test.encodeTokenA(test.getToken());
test.encodeTokenB(test.getToken());
System.out.println(test.getToken());
}
}
答案 0 :(得分:3)
您的代码中存在两个主要缺陷。
首先,如果你仔细观察方法encodeTokenA(),
while (st.hasMoreTokens()){
String token = st.nextToken();
System.out.format(token + "~~~");
}
return token;
这里你在循环中格式化了块级别的字符串'token',但你最终会返回实例变量'token'。
其次,在你的两个函数调用encodeTokenA()和encodeTokenB()之间,你期望修改String对象。 记住字符串在java中是不可变的。
答案 1 :(得分:2)
为什么不呢:
String whatever = "Java Programming."
.replace('a', '@')
.replaceAll("\\s", "~~~");
答案 2 :(得分:0)
您还引入了一个本地范围var token
,它不会修改您的实例var token
(由@Ankur提及)
@sjr通过发布使用内置方法更简洁的概念来实现这一切