2010-03-01 22 views
21

Mam plik tekstowy zawierający dane oddzielone przez "|". Muszę uzyskać każde pole (oddzielone przez "|") i przetworzyć je. Plik tekstowy może być pokazany poniżej:tokenizer napisów w Javie

ABC | DEF || FGHT

Używam ciąg tokenizera (JDK 1.4) do uzyskania wartości pól. Teraz problem polega na tym, że powinienem otrzymać pusty ciąg znaków po DEF.Jednak nie otrzymuję pustej przestrzeni między DEF & FGHT.

Mój wynik powinien być - ABC, DEF, "", FGHT ale jestem coraz ABC, DEF, FGHT

Odpowiedz

56

Od StringTokenizer dokumentacji:

StringTokenizer jest klasa dziedzictwo, które jest zachowana ze względu na kompatybilność choć jego stosowanie nie jest zalecane w nowym kodem . Zaleca się, aby każdy użytkownik szukający tej funkcji korzystał z metody split String lub pakietu java.util.regex .

Poniższy kod powinien działać:

String s = "ABC|DEF||FGHT"; 
String[] r = s.split("\\|"); 
2

można użyć konstruktora, który przyjmuje wartość logiczną Extra 'returnDelims', i przekazać wierny temu. w ten sposób otrzymasz ograniczniki, które pozwolą ci wykryć ten stan.

Alternatywnie możesz po prostu zaimplementować swój własny tokenizer, który robi to, czego potrzebujesz, to nie jest takie trudne.

9

StringTokenizer ignoruje puste elementy. Rozważ użycie String.split, który jest również dostępny w wersji 1.4.

Z Javadocs:

StringTokenizer jest klasa dziedzictwo, które jest zachowana ze względu na kompatybilność choć jego stosowanie nie jest zalecane w nowym kodem . Zaleca się, aby każdy użytkownik szukający tej funkcji korzystał z metody split String lub pakietu java.util.regex .

15

Użyj flagę returnDelims i sprawdzić dwie kolejne wystąpienia ogranicznika:

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; 
} 

Drukuje

ABC 
DEF 
null 
FGHT 

API nie jest ładny, a zatem za spuścizna (czyli „prawie przestarzały "). Używaj go tylko tam, gdzie dopasowywanie wzorców jest zbyt kosztowne (co powinno mieć miejsce tylko w przypadku bardzo długich łańcuchów) lub gdy interfejs API oczekuje wyliczenia.

W przypadku zmiany na String.split(String), należy zacytować ogranicznik.Albo ręcznie ("\\|") lub automatycznie za pomocą string.split(Pattern.quote(delim));

2

To proste, jak to ...

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

Wynik:

StringTokenizer 
    by 
    Himal 
+0

dane wejściowe rozdzielając je „|” a StringTokenizer uchwycić tylko spacje? – Azi

+0

nie .. możemy użyć dowolnego ogranicznika. może to być puste miejsce, znak, zestaw ciągów wszystkiego ... – MacKa

2

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

} 

}

wyjściowa:

Wprowadź ciąg odwrócenia

oryginalny ciąg jest: TO JEST ASHIK SKLAB

Odwrócony ciąg jest : SKLAB ASHIK TO TEN

+0

ładny kod! +1 :) :) – ADJ

2

Oto kolejny sposób na rozwiązanie tego problemu

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; 
    } 
+0

Ta odpowiedź niczego nie dodaje. I w tym przypadku, jak stwierdza przyjęta odpowiedź (opublikowana w 2010 r.), Zaleca się, aby na początku nie używać "StringTokenizer". – Radiodef

Powiązane problemy