0

注意:我必须为这个程序使用 StringTokenizer (这是一个分配)

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

我对以下代码有2个问题...

  1. 我的第一个 StringTokenizer 在控制台上显示了我需要的内容,但最后添加了一个不需要的额外“@”。
  2. 它没有抓住我的字符串标记,因为它是“J@v@ Progr@mming”。应用第二个 StringTokenizer,它会在有空格的地方添加“~~~”。

我错过了什么?我浏览了 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());


    }

}
4

3 回答 3

3

您的代码中有两个主要缺陷。

首先,如果您仔细观察方法 encodeTokenA() ,

 while (st.hasMoreTokens()){
          String token = st.nextToken();
          System.out.format(token + "~~~");
          }
          return token;

在这里,您在循环内格式化了块级字符串“token”,但最终返回了实例变量“token”。

其次,在您的两个函数调用 encodeTokenA() 和 encodeTokenB() 之间,您期望 String 对象被修改。记住字符串在java中是不可变的。

于 2013-07-20T14:58:00.250 回答
2

为什么不只是:

String whatever = "Java Programming."
    .replace('a', '@')
    .replaceAll("\\s", "~~~");
于 2013-07-20T14:53:25.667 回答
0
  1. 在 encodeTokenA 的 while 循环中,您将在每个循环中打印出令牌 + @。这就是为什么您将始终拥有“额外的@”的原因。
  2. 您的两个编码方法只会返回标记化字符串中的最后一个标记。如果你想构建一个完全替换的字符串,你应该实例化一个 StringBuffer 并追加,然后分配给你的令牌。

您还引入了一个本地范围 var token,它不会修改您的实例 var token(@Ankur 提到)

@sjr 通过发布一个使用内置方法更简洁的概念使这一切变得毫无意义

于 2013-07-20T15:02:34.710 回答