2013-07-20 2 views
0

Примечание: Я должен использовать 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()); 


    } 

} 
+0

[StringTokenizer] (http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html) является [унаследованным классом] (http://stackoverflow.com/ а/6983908/1393766). Почему бы просто не использовать методы String, такие как «Java-программирование» .replace («", "~~~"). Replace ('a', '@') '? – Pshemo

+0

Почему вы используете stringtokenizer? Я не вижу в этом необходимости. Вы могли бы просто использовать .replace ('a', '@') –

+0

Хотелось бы, чтобы я мог использовать что-то еще, но это для назначения, и нам НЕОБХОДИМО использовать StringTokenizer. –

ответ

2

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

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

Помните, что метод [replaceAll()] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html) принимает значение regexp как аргумент – reto

+1

-1, потому что вы не ответьте на его вопрос. –

+1

true, иногда люди просто не знают, что эти API существуют, хотя – sjr

3

Есть два основных недостатков в вашем коде.

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

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

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

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

+0

Так что я должен добавить оба токена в один метод, чтобы сделать эту работу?Это для назначения, поэтому мне нужно использовать StringTokenizer для получения этого .... –

+0

Во-первых, вы должны вернуть форматированное значение из метода encodeTokenA() и передать это форматированное значение следующему методу (encodeTokenB()). Однако я все еще не уверен, что ваша логика форматирования даст вам ожидаемые результаты. Но то, что я упомянул, должно быть сделано в первую очередь. Затем проверьте свою логику форматирования. –

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

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

@sjr сделал все это спорный, разместив концепцию, более лаконичным, используя встроенные -in методы

+0

Мне нравится ваша идея использования StringBuffer, но не знаю, как реализовать это .... –

Смежные вопросы