2010-03-01 33 views
21

Tôi có tệp văn bản chứa dữ liệu được phân tách bằng '|'. Tôi cần phải có được mỗi lĩnh vực (tách biệt bởi '|') và xử lý nó. Các tập tin văn bản có thể được hiển thị như sau:mã thông báo chuỗi trong Java

ABC | DEF || FGHT

Tôi đang sử dụng chuỗi tokenizer (JDK 1.4) để nhận mỗi giá trị trường. Bây giờ vấn đề là, tôi sẽ nhận được một chuỗi rỗng sau khi DEF.Tuy nhiên, tôi không nhận được không gian trống giữa DEF & FGHT.

kết quả của tôi nên - ABC, DEF, "", FGHT nhưng tôi nhận được ABC, DEF, FGHT

Trả lời

56

Từ StringTokenizer tài liệu:

StringTokenizer là một lớp học di sản mà được giữ lại vì lý do tương thích mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Chúng tôi đề nghị bất kỳ ai tìm kiếm chức năng này sử dụng phương pháp tách của Chuỗi hoặc gói java.util.regex thay thế.

Các mã sau đây nên làm việc:

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

bạn có thể sử dụng các nhà xây dựng mà sẽ đưa boolean thêm 'returnDelims', và vượt qua đúng với nó. theo cách này, bạn sẽ nhận được các dấu phân cách, cho phép bạn phát hiện tình trạng này.

cách khác bạn chỉ có thể triển khai trình mã thông báo chuỗi của riêng bạn thực hiện những gì bạn cần, không khó.

9

StringTokenizer bỏ qua các yếu tố sản phẩm nào. Xem xét sử dụng String.split, cũng có sẵn trong 1.4.

Từ javadocs:

StringTokenizer là một lớp học di sản mà được giữ lại vì lý do tương thích mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Chúng tôi đề nghị bất kỳ ai tìm kiếm chức năng này sử dụng phương pháp tách của Chuỗi hoặc gói java.util.regex thay thế.

15

Sử dụng returnDelims cờ và kiểm tra hai lần xuất hiện tiếp theo của delimiter:

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

này in

ABC 
DEF 
null 
FGHT 

API là không đẹp và do đó được coi là di sản (tức là "gần như đã lỗi thời "). Chỉ sử dụng nó với vị trí khớp mẫu quá đắt (chỉ nên là trường hợp cho các chuỗi cực dài) hoặc nơi API dự kiến ​​một liệt kê.

Trong trường hợp bạn chuyển sang String.split(String), hãy đảm bảo trích dẫn dấu phân tách.Hoặc bằng tay ("\\|") hoặc tự động sử dụng string.split(Pattern.quote(delim));

2

Nó đơn giản như thế này ...

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

Kết quả:

StringTokenizer 
    by 
    Himal 
+0

dữ liệu đầu vào tách bằng '|' và StringTokenizer chỉ chụp khoảng trống? – Azi

+0

không .. chúng tôi có thể sử dụng bất kỳ dấu phân cách nào. nó có thể là một không gian trống, ký tự, một tập hợp các chuỗi .. – MacKa

2

gói com.java.String;

nhập 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); 

} 

}

Output:

Nhập một chuỗi đảo ngược

chuỗi gốc là: ĐÂY LÀ ASHIK SKLAB

chuỗi đảo ngược là : SKLAB ASHIK LÀ NÀY

+0

mã đẹp! +1 :) – ADJ

2

Đây là một cách khác để giải quyết vấn đề này

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

Câu trả lời này không thêm bất cứ điều gì. Và cho rằng vấn đề, như là câu trả lời chấp nhận (được đăng trong năm 2010) nói, nó được khuyến khích không sử dụng 'StringTokenizer' để bắt đầu với. – Radiodef

Các vấn đề liên quan