如何让StringTokenizer正确替换字母?

时间:2013-07-20 14:46:34

标签: java stringtokenizer

注意:我必须为此程序使用StringTokenizer(它用于作业)

我正在尝试将此字符串“Java Programming”。说“J @ v @ ~~~ Progr @mming。”使用StringTokenizer。

我遇到以下代码的2个问题......

  1. 我的第一个StringTokenizer在控制台上显示我需要的内容,但最后添加了一个不需要的额外“@”。
  2. 它没有抓住我的字符串标记,因为它是“J @ v @ Progr @mming”。应用第二个StringTokenizer,它会在有空格的地方添加“~~~”。
  3. 我缺少什么?我浏览了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());
    
    
        }
    
    }
    

3 个答案:

答案 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)

  1. 在encodeTokenA的while循环中,您将在每个循环上打印出令牌+ @。这就是为什么你总是会有'额外@'。
  2. 您的两个编码方法只会返回标记化字符串中的最后一个标记。如果要构建完全替换的字符串,则应实例化StringBuffer并追加,然后分配给您的令牌。
  3. 您还引入了一个本地范围var token,它不会修改您的实例var token(由@Ankur提及)

    @sjr通过发布使用内置方法更简洁的概念来实现这一切