Как я могу заставить StringTokenizer правильно заменить букву?

Примечание. Я должен использовать StringTokenizer для этой программы (это для задания)

Я пытаюсь получить эту строку «Программирование на Java». чтобы сказать "J@v@~~~Progr@mming." со StringTokenizer.

У меня есть 2 проблемы со следующим кодом...

  1. Мой первый StringTokenizer отображает то, что мне нужно, на консоли, но добавляет в конце ненужный лишний "@".
  2. Он не захватывает мой строковый токен, так как это «J@v@Progr@mming». применить второй StringTokenizer, который добавит "~~~" там, где есть пробел.

Что мне не хватает? Я просмотрел документы API Java и не смог понять.

    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());


    }

}

person Emmanuel Henri    schedule 20.07.2013    source источник
comment
StringTokenizer — это устаревший класс. Почему бы просто не использовать методы String, такие как "Java Programming".replace(" ","~~~").replace('a','@')?   -  person Pshemo    schedule 20.07.2013
comment
Почему вы используете stringtokenizer? Я не вижу в этом необходимости. Вы можете просто использовать .replace('a','@')   -  person Rosdi Kasim    schedule 20.07.2013
comment
Я хотел бы использовать что-то еще, но это для задания, и, к сожалению, нам НЕОБХОДИМО использовать StringTokenizer.   -  person Emmanuel Henri    schedule 20.07.2013


Ответы (3)


В вашем коде есть два серьезных недостатка.

Во-первых, если вы внимательно наблюдаете за методами encodeTokenA(),

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

Здесь вы отформатировали «токен» строки уровня блока внутри цикла, но в конечном итоге вы возвращаете переменную экземпляра «токен».

Во-вторых, между двумя вашими вызовами функций encodeTokenA() и encodeTokenB() вы ожидаете, что объект String будет изменен. Помните, что в Java строки неизменяемы.

person Ankur Shanbhag    schedule 20.07.2013
comment
Итак, я должен добавить оба токена, замененные одним методом, чтобы это сработало? Это для задания, поэтому мне нужно использовать StringTokenizer, чтобы получить это.... - person Emmanuel Henri; 20.07.2013
comment
Во-первых, вы должны вернуть форматированное значение из метода encodeTokenA() и передать это форматированное значение следующему методу (encodeTokenB()). Однако я все еще не уверен, что ваша логика форматирования даст ожидаемые результаты. Но вещи, которые я упомянул, должны быть сделаны в первую очередь. Затем проверьте логику форматирования. - person Ankur Shanbhag; 20.07.2013

Почему бы просто не:

String whatever = "Java Programming."
    .replace('a', '@')
    .replaceAll("\\s", "~~~");
person sjr    schedule 20.07.2013
comment
Помните, что метод replaceAll() принимает регулярное выражение в качестве аргумента - person reto; 20.07.2013
comment
правда, иногда люди просто не знают, что эти API существуют - person sjr; 20.07.2013

  1. в вашем цикле while в encodeTokenA вы печатаете токен + @ в каждом цикле. Вот почему у вас всегда будет «дополнительный @».
  2. ваши два метода кодирования вернут только последний токен в вашей токенизированной строке. Если вы хотите создать полностью замененную строку, вы должны создать экземпляр StringBuffer и добавить его, а затем назначить свой токен.

Вы также ввели локальную область видимости var token, которая не изменит ваш экземпляр var token (упомянутый @Ankur)

@sjr сделал все это спорным, опубликовав более краткую концепцию с использованием встроенных методов.

person akf    schedule 20.07.2013