style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Duda con StringTokenizer

Bueno recurro a ustedes por una pequeña duda que tengo, hace unos dias estaba haciendo la tarea de la universidad y en alguna parte del codigo tuve que mostrar la cadena actual de mi objeto de la clase StringTokenizer:

/******************************************************************
StringTokenizer tokenizer = new StringTokenizer( "Prueba");

System.out.println( tokenizer );
/******************************************************************

Lo que yo queria era obtener la cadena del objeto StringTokenizer, pero en vez que el codigo anterior me lanzara "Prueba", me lanza algo como esto "java.util.StringTokenizer@3e25a5",

No me quedo otra opcion que hacerlo asi:

/******************************************************************

StringTokenizer tokenizer = new StringTokenizer( "Prueba");

String cadena = "";

while( tokenizer.hasMoreTokens() )
     cadena += tokenizer.nextToken();      

System.out.println( cadena );

// Pero cuando hacia esto perdia la cadena que contiene el objeto StringTokenizer
// por lo que para no perder esa informacion tenia que hacer esto

tokenizer = new StringTokenizer( cadena );

/******************************************************************

Bueno mi duda es sobre si hay OTRA forma de mostrar la cadena de un StringTokenizer sin
perder dicha cadena, ya que la forma como yo lo hice me parece muy ineficiente para algo tan simple ?

UNMSM - FISI

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de benek

StringTokenizer

Creo que no tienes clara la utilidad y funcionamiento de la clase StringTokenizer.

StringTokenizer es una clase que funciona como splitter de cadenas, es decir que dado un caracter "delimitador" partirá una cadena en varias cadenas más a las que llamará "tokens".

Por ejemplo para separar una cadena cada que haya espacios " " en ella se haría de la siguiente manera:

package lol;

import java.util.StringTokenizer;

/**
 * Clase para ejemplificar el uso de StringTokenizer.
 * javaMexico.org
 * @author Javier Ramirez Jr.
 */

public class Pruebas {
       
        public static void main(String[] args) {
               
                //Se crea el token indicando en primer parámetro la cadena a separar
                //y en el segundo parámetro el caracter delimitador que es un espacio: " "
                //::
                //El tokenizer queda entonces con 6 tokens.
                StringTokenizer tokenizer = new StringTokenizer("Esto es una prueba - JavaMexico.org", " ");
               
                //Se crea un ciclo que se ejecutará mientras hasMoreTokens()
                //devuelva true, que significa que se ejecuta mientras aún
                //tenga tokens.
                while(tokenizer.hasMoreTokens()){

                        //El método nextToken() devuelve el token en curso, la
                        //primera vez devolverá "Esto"
                        System.out.println(tokenizer.nextToken());
                }
               
        }

}

Por eso se te hace mucho código para tan poco que hace, porque tu le estás pasando solo "Prueba", lo que significa que tendrá solamente 1 token y la idea es que StringTokenizer te sirva para partir una cadena usualmente larga.

Con respecto a lo que te imprime cuando haces el System.out.println(tokenizer); la respuesta es sencilla: StringTokenizer no es un String sino un objeto que almacenará Strings, por eso te imprime la información del objeto.

Saludos.

Imagen de XinefPro

Si se para que sirve el StringTokenizer

Oye me confundi en el constructor del StringTokenizer , me falto el segundo parametro.
Bueno masomenos tratare de explicarte porque tengo la necesidad de convertir un StringTokenizer a un String,
mira lo que pasa es que tengo una expresion posfija, la cual la he encapsulado en un objeto de la clase StringTokenizer masomenos asi :
StringTokenizer tokenizer = new StringTokenizer( "ExpresionPostfija", "+*-/^() ", true );

Luego dentro de un bucle voy analizando cada token de la expresion postfija masomenos asi :

while( tokenizer.hashMoreTokens() )
{
     String letra = tokenizer.nextToken();

     if( letra.equals( "+" ) )   /* realizar una suma */
     if( letra.equals( "-" ) )   /* realizar una resta */
     if( letra.equals( "/" ) )   /* realizar una division */

     // Pero para la potencia, la cual se representa por dos asteriscos ( "**" )
     // necesito saber si la siguiente letra es tambien un asterisco( "*" )
     if( letra.equals( "*" ) )  
     {
          // obtengo la siguiente letra
           String otraLetra = tokenizer.nextToken();

         // Verifico si es otro asterisco, lo cual indica que se tiene que realizar la potenciacion
         if( otraLetra.equals( "*" ) )
                /* realizar la potenciacion */
         else
                /* realizar la multiplicacion */
     }

     else
             /* Otro codigo */
}

Mira mi problema surge cuando trato de verificar si la otraLetra es un asterisco, en el caso de que no sea un asterisco, se realizara
una multiplicacion, PERO como ya lei la otra letra esa informacion se pierde, osea porsi es que no me entendiste te doy un ejemplo :
si la expresion es la siguiente : "54*4+"

- 1ra Iteracion : Obtenemos el 5. tokenizer queda asi : "4*4+"
- 2da Iteracion : Obtenemos el 4. tokenizer queda asi : "*4+"
- 3ra Iteracion : Obtenemos el *. tokenizer queda asi : "4+"

Si es que leo el siguiente token para verificar si es un asterisco, el objeto tokenizer quedaria asi : "+",
y al verificar me indicaria que este ultimo token no es un asterisco sino que es el numero 4, por lo tanto se realizaria una multiplicacion,
pero que pasaria con el numero 4, se perdio =(.
La solucion que se me ocurrio al principio fue buscar un metodo para leer el token ( en este caso seria el numero 4 ), y luego devolverlo al objeto tokenizer, pero me di con la sorpresa de que no existe un metodo asi, por lo que la otra solucion que me quedaba era que antes de leer ese token ( el numero 4 ) guardara la cadena en un objeto String, para que si es que se da el caso de que no es otro asterisco entonces pudiera recuperar el objeto tokenizer original asi :

while( tokenizer.hashMoreTokens() )
{
     String letra = tokenizer.nextToken();

     if( letra.equals( "+" ) )   /* realizar una suma */
     if( letra.equals( "-" ) )   /* realizar una resta */
     if( letra.equals( "/" ) )   /* realizar una division */

     // Pero para la potencia, la cual se representa por dos asteriscos ( "**" )
     // necesito saber si la siguiente letra es tambien un asterisco( "*" )
     if( letra.equals( "*" ) )  
     {
   
         String cadenaTemporal = /* obtenemos la cadena del objeto tokenizer ( aun nose como hacerlo de forma eficiente ) */

          // obtengo la siguiente letra
           String otraLetra = tokenizer.nextToken();

         // Verifico si es otro asterisco, lo cual indica que se tiene que realizar la potenciacion
         if( otraLetra.equals( "*" ) )
                /* realizar la potenciacion */
         else
                // Como la otra letra no es un asterisco entonces regreso el tokenizer a su estado anterior asi
                tokenizer = new StringTokenizer( cadenaTemporal, "+*-/^() ", true );
                /* realizar la multiplicacion */
     }

     else
             /* Otro codigo */
}

Bueno si es que me entendiste, te bras dado cuenta de que el problema que tengo es como hallar la variable cadenaTemporal de manera eficiente, que no sea el metodo que se me ocurrio ami sino otro mas eficiente .

Ah porcierto sobre lo del System.out.println( tokenizer );
por lo poco que se, tengo entendido que el System.out.println( objeto );
llama por default al metodo toString() del objeto.

Por eso como para un objeto de la clase StringBuffer, al ponerlo dentro de un System.out.println( /* objeto de StringBuffer */ ),
se muestra el String que ha sido encapsulado dentro del objeto StringBuffer, pense que pasaria lo mismo con un objeto StringTokenizer
Bueno gracias de antemano

PD : Es necesario usar el objeto de la clase StringTokenizer , ya saben un capricho del profe .

atte : Un novato enJava

UNMSM - FISI

Imagen de ezamudio

stack

Se supone que para notación postfija (y realmente también para infija, y prefija) necesitas manejar una pila donde vas almacenando los valores y/o los operandos que vas a manejar. En caso de operaciones muy sencillas con 1 operando y 2 operaciones no necesitas la pila pero si piensas manejar algo más complicado, entonces sí necesitas manejarla. No hay razón para que pierdas esa otra letra, simplemente almacénala en otra variable temporal porque hay casos donde necesitas tener acceso a un valor anterior. Tener acceso a la cadena completa del StringTokenizer no sería la solución óptima de todas formas y de cualquier forma el tokenizer se va a inicializar con una cadena que viene de otra parte (user input, por ejemplo), de modo que puedes tener la cadena intacta Y el tokenizer (las cadenas son inmutables por lo que pasarla al tokenizer no la modifica en absoluto).

Imagen de XinefPro

Si uso pilas

Lo que pasa es que solo he puesto un fragmento muy reducido del codigo, el problema es del libro Estructura de datos en Java del autor Mark Allen Weiss, en el capitulo 11 el cual se llama "Las pilas y los compiladores", exactamente esta en la seccion de "Problemas Practicos " 11.6, si es que tienes el libro a la mano me entenderas mejor XD

UNMSM - FISI

ayuda acerk de cadenas en JAva

Saludos a todos!!
Soy nuevo en esto del Java, apenas voy iniciando. Tengo una duda,

como puedo ingresar una cadena que represente una fecha de la forma MM/DD/AA por ejemplo 20/03/04,
Lo que pasa es que necesito introducir una fecha de este tipo, y despues separarla utilizando
la clase StringTokenizer para dividirla. Mi duda es como ingreso esa cadena.
Se los agradceria mucho sime pudiesen ayudar.
Gracias

SimpleDateFormat??

Puedes usar SimpleDateFormat para convertir String-Date-String con un formato que tu quieras. Echale un lente a esto: http://www.java2s.com/Tutorial/Java/0040__Data-Type/SimpleDateFormat.htm

si es para ingresar el texto desde la terminal no se, creo que no puedes definir formatos de entrada osea cmo pintar un formulario y rellenar los campos, si es en Swing me parece que agregas mascaras (JFormattedTextField) si es en web pos con JS puedes crear la validacion

Checa esto:
http://www.froses.com/Assets/Files/Articles/JFormattedTextField.pdf
http://www.smartwebby.com/DHTML/date_validation.asp

(seria bueno mecnionar a donde o desde donde quieres ingresar el texto)

@clark89 Puedes explicar más

@clark89 Puedes explicar más a que te refieres con "introducir"? Quieres que el usuario lo escriba? Lo quieres introducir en el código?. O como?

Crea una nueva pregunta en los foros. Es mejor que escribir sobre una pregunta existente. Ejemplo:

"Encontré en esta pregunta: http://www.javamexico.org/foros/java_standard_edition/duda_con_stringtok... como usar un tokenizer, pero quiero saber como puede el usuario capturar esa fecha y yo luego dividirla con blah, blah, blah, lo que llevo es:..."

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">