example - tokenizer de cadena en Java
stringtokenizer java example (8)
Tengo un archivo de texto que contiene datos separados por ''|''. Necesito obtener cada campo (separado por ''|'') y procesarlo. El archivo de texto se puede mostrar a continuación:
ABC | DEF || FGHT
Estoy usando el tokenizador de cadenas (JDK 1.4) para obtener cada valor de campo. Ahora el problema es que debo obtener una cadena vacía después de DEF. Sin embargo, no obtengo el espacio vacío entre DEF y FGHT.
Mi resultado debería ser: ABC, DEF, "", FGHT pero obtengo ABC, DEF, FGHT
Aquí hay otra forma de resolver este problema.
String str = "ABC|DEF||FGHT";
StringTokenizer s = new StringTokenizer(str,"|",true);
String currentToken="",previousToken="";
while(s.hasMoreTokens())
{
//Get the current token from the tokenize strings
currentToken = s.nextToken();
//Check for the empty token in between ||
if(currentToken.equals("|") && previousToken.equals("|"))
{
//We denote the empty token so we print null on the screen
System.out.println("null");
}
else
{
//We only print the tokens except delimiters
if(!currentToken.equals("|"))
System.out.println(currentToken);
}
previousToken = currentToken;
}
Aquí hay una manera de dividir una cadena en tokens (un token es una o más letras)
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
s = s.replaceAll("[^A-Za-z]", " ");
StringTokenizer arr = new StringTokenizer(s, " ");
int n = arr.countTokens();
System.out.println(n);
while(arr.hasMoreTokens()){
System.out.println(arr.nextToken());
}
scan.close();
}
Es tan simple como esto ...
import java.util.StringTokenizer;
class stringtoken{
public static void main (String args[]){
String s1 = "StringTokenizer|by|Himal";
StringTokenizer stt = new StringTokenizer(s1,"|");
while (stt.hasMoreTokens()){
String token = stt.nextToken();
System.out.println(token);
}
}
}
Resultado:
StringTokenizer
by
Himal
StringTokenizer ignora los elementos vacíos. Considere el uso de String.split, que también está disponible en 1.4.
De los javadocs:
StringTokenizer es una clase heredada que se conserva por razones de compatibilidad, aunque su uso no se recomienda en el nuevo código. Se recomienda que cualquier persona que busque esta funcionalidad use el método split de String o el paquete java.util.regex.
Use la bandera returnDelims
y marque dos apariciones posteriores del delimitador:
String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);
boolean expectDelim = false;
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
if (delim.equals(token)) {
if (expectDelim) {
expectDelim = false;
continue;
} else {
// unexpected delim means empty token
token = null;
}
}
System.out.println(token);
expectDelim = true;
}
esto imprime
ABC
DEF
null
FGHT
La API no es bonita y, por lo tanto, se considera legada (es decir, "casi obsoleta"). Úselo solo cuando la coincidencia de patrones es demasiado costosa (como debería ser el caso de cadenas extremadamente largas) o cuando una API espera una Enumeración.
En caso de que cambie a String.split(String)
, asegúrese de indicar el delimitador. Ya sea manualmente ( "//|"
) o automáticamente usando string.split(Pattern.quote(delim));
puede utilizar el constructor que toma un booleano extra ''returnDelims'', y pasarle el mismo. De esta forma recibirá los delimitadores, que le permitirán detectar esta condición.
alternativamente, puede implementar su propio tokenizador de cadena que hace lo que necesita, no es tan difícil.
De la documentación de StringTokenizer
:
StringTokenizer es una clase heredada que se conserva por razones de compatibilidad, aunque su uso no se recomienda en el nuevo código. Se recomienda que cualquier persona que busque esta funcionalidad use el método split de String o el paquete java.util.regex.
El siguiente código debería funcionar:
String s = "ABC|DEF||FGHT";
String[] r = s.split("//|");
package com.java.String;
import java.util.StringTokenizer;
public class StringWordReverse {
public static void main(String[] kam) {
String s;
String sReversed = "";
System.out.println("Enter a string to reverse");
s = "THIS IS ASHIK SKLAB";
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
sReversed = st.nextToken() + " " + sReversed;
}
System.out.println("Original string is : " + s);
System.out.println("Reversed string is : " + sReversed);
}
}
Salida:
Introduzca una cadena para invertir
La cadena original es: ESTE ES ASHIK SKLAB
La cadena invertida es: SKLAB ASHIK IS THIS