Java 如何使StringTokenizer正确替换字母?

Java 如何使StringTokenizer正确替换字母?,java,stringtokenizer,Java,Stringtokenizer,注意:我必须为此程序使用StringTokenizer(它用于分配任务) 我试图得到这个字符串“Java编程”J@v@~~~Progr@mming.“使用StringTokenizer 我对以下代码有2个问题 我的第一个StringTokenizer在控制台上显示我需要的内容,但在末尾添加了不必要的额外“@” 它没有抓住我的字符串标记,因为它是“J@v@ Progr@mming.应用第二个StringTokenizer,它将在有空格的地方添加“~~~” 我错过了什么?我浏览了Java的API文档

注意:我必须为此程序使用StringTokenizer(它用于分配任务)

我试图得到这个字符串“Java编程”J@v@~~~Progr@mming.“使用StringTokenizer

我对以下代码有2个问题

  • 我的第一个StringTokenizer在控制台上显示我需要的内容,但在末尾添加了不必要的额外“@”
  • 它没有抓住我的字符串标记,因为它是“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());
    
    
        }
    
    }
    
    为什么不只是:

    String whatever = "Java Programming."
        .replace('a', '@')
        .replaceAll("\\s", "~~~");
    
    为什么不只是:

    String whatever = "Java Programming."
        .replace('a', '@')
        .replaceAll("\\s", "~~~");
    

    代码中有两个主要缺陷

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

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


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

    代码中有两个主要缺陷

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

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

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

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

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

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


    @sjr发布了一个使用内置方法更简洁的概念,使这一切变得毫无意义。为什么不直接使用字符串方法,比如
    “Java编程”。替换(“,“~~~”)。替换('a','@')
    ?为什么要使用stringtokenizer?我认为没有必要那样做。您可以使用.replace('a','@'),我希望我可以使用其他东西,但它是用于赋值的,不幸的是,我们需要使用StringTokenizer。是为什么不直接使用字符串方法,比如
    “Java编程”。替换(“,“~~~”)。替换('a','@')
    ?为什么要使用stringtokenizer?我认为没有必要那样做。您可以只使用.replace('a','@')我希望我可以使用其他东西,但它是用于赋值的,不幸的是我们需要使用StringTokenizer。因此,我是否应该在一个方法中添加两个替换的标记以使其工作?这是用于赋值的,因此我需要使用StringTokenizer来实现……首先,您应该从方法encodeTokenA()返回格式化值,并将此格式化值传递给下一个方法(encodeTokenB())。但是,我仍然不确定您的格式化逻辑是否会产生预期的结果。但我提到的事情必须先做。然后检查您的格式化逻辑。那么我是否应该在一个方法中添加两个替换的令牌以使其工作?这是用于赋值的,因此我需要使用StringTokenizer来实现……首先,您应该从方法encodeTokenA()返回格式化值,并将此格式化值传递给下一个方法(encodeTokenB())。但是,我仍然不确定您的格式化逻辑是否会产生预期的结果。但我提到的事情必须先做。然后检查您的格式逻辑。请记住,该方法将regexp作为argumenttrue,有时人们不知道这些API的存在,但请记住,该方法将regexp作为argumenttrue,有时人们不知道这些API的存在