Panduan Pantas untuk Java StringTokenizer

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan meneroka kelas asas di Java - the StringTokenizer .

2. StringTokenizer

The StringTokenizer kelas membantu kita berpecah Strings ke dalam pelbagai token.

StreamTokenizer memberikan fungsi yang serupa tetapi kaedah tokenisasi jauh lebih mudah daripada yang digunakan oleh kelas StreamTokenizer . Kaedah StringTokenizer tidak membezakan antara pengecam, nombor, dan rentetan petikan, atau mengenali dan melangkau komen.

Kumpulan pembatas (watak yang memisahkan token) boleh ditentukan sama ada pada waktu penciptaan atau berdasarkan per token.

3. Menggunakan StringTokenizer

Contoh paling mudah menggunakan StringTokenizer adalah dengan membelah String berdasarkan pembatas yang ditentukan.

Dalam contoh ringkas ini, kita akan membahagikan String argumen dan menambahkan token ke dalam senarai :

public List getTokens(String str) { List tokens = new ArrayList(); StringTokenizer tokenizer = new StringTokenizer(str, ","); while (tokenizer.hasMoreElements()) { tokens.add(tokenizer.nextToken()); } return tokens; } 

Perhatikan bagaimana kita memecahkan rentetan ke dalam senarai token berdasarkan pembatas ' , '. Kemudian dalam gelung, menggunakan kaedah tokens.add () ; kami menambahkan setiap token ke dalam ArrayList.

Sebagai contoh, jika pengguna memberikan input sebagai " Welcome, to, baeldung.com ", metode ini harus mengembalikan daftar yang berisi fragmen tiga kata sebagai " Welcome ", " to " dan " baeldung.com ".

3.1. Pendekatan Java 8

Sejak StringTokenizer alat Penghitungan antara muka, kita boleh menggunakannya dengan J ava 's Collections antara muka.

Sekiranya kita mempertimbangkan contoh sebelumnya, kita dapat mengambil sekumpulan token yang sama menggunakan kaedah Collections.list () dan API Aliran :

public List getTokensWithCollection(String str) { return Collections.list(new StringTokenizer(str, ",")).stream() .map(token -> (String) token) .collect(Collectors.toList()); }

Di sini, kita meneruskan StringTokenizer itu sendiri sebagai parameter dalam kaedah Collections.list () .

Yang perlu diperhatikan di sini ialah, kerana Enumerasi adalah jenis Objek , kita perlu memasukkan token ke jenis String (iaitu bergantung pada pelaksanaannya; jika kita menggunakan List of Integer / Float maka kita perlu menaip-cast dengan Integer / Float ).

3.2. Varian StringTokenizer

StringTokenizer dilengkapi dengan dua konstruktor yang berlebihan di samping konstruktor lalai: StringTokenizer (String str) dan StringTokenizer (String str, String delim, boolean returnDelims):

StringTokenizer (String str, String delim, boolean returnDelims) mengambilinput boolean tambahan. Sekiranya nilai boolean adalah benar , maka StringTokenizer menganggap pembatas itu sendiri sebagai token dan menambahkannya ke kumpulan token dalamannya.

StringTokenizer (String str) adalah jalan pintas untuk contoh sebelumnya; secara dalaman memanggil konstruktor lain dengan pembatas berkod keras sebagai "\ t \ n \ r \ f" dan nilai boolean sebagai salah.

3.3. Penyesuaian Token

StringTokenizer juga dilengkapi dengan kaedah nextToken () yang terlalu banyak yang mengambil fragmen rentetan sebagai input. Ini String serpihan bertindak sebagai satu set tambahan pembatas; berdasarkan token mana yang disusun semula.

Sebagai contoh, jika kita dapat meneruskan ' e ' dalam kaedah nextToken () untuk memecahkan rentetan berdasarkan pembatas ' e ':

tokens.add(tokenizer.nextToken("e"));

Oleh itu, untuk rentetan ' Hello, baeldung.com ' yang diberikan, kami akan menghasilkan token berikut:

H llo ba ldung.com

3.4. Panjang Token

Untuk mengira nombor yang ada token, kita boleh menggunakan StringTokenizer 's saiz kaedah:

int tokenLength = tokens.size();

3.5. Membaca Dari Fail CSV

Sekarang, mari kita cuba menggunakan StringTokenizer dalam kes penggunaan sebenar.

Terdapat senario di mana kita cuba membaca data dari fail CSV dan menguraikan data berdasarkan pembatas yang diberikan pengguna.

Dengan menggunakan StringTokenizer , kita dapat dengan mudah ke sana:

public List getTokensFromFile( String path , String delim ) { List tokens = new ArrayList(); String currLine = ""; StringTokenizer tokenizer; try (BufferedReader br = new BufferedReader( new InputStreamReader(Application.class.getResourceAsStream( "/" + path )))) { while (( currLine = br.readLine()) != null ) { tokenizer = new StringTokenizer( currLine , delim ); while (tokenizer.hasMoreElements()) { tokens.add(tokenizer.nextToken()); } } } catch (IOException e) { e.printStackTrace(); } return tokens; }

Di sini, fungsi tersebut mengambil dua hujah; satu sebagai nama fail CSV (iaitu dibaca dari folder sumber [src -> main -> resources] ) dan yang lain sebagai pembatas.

Berdasarkan dua argumen ini, data CSV dibaca baris demi baris, dan setiap baris diberi token menggunakan StringTokenizer .

Sebagai contoh, kami telah memasukkan kandungan berikut dalam CSV:

1|IND|India 2|MY|Malaysia 3|AU|Australia

Oleh itu, token berikut harus dihasilkan:

1 IND India 2 MY Malaysia 3 AU Australia

3.6. Ujian

Sekarang, mari buat kes ujian cepat:

public class TokenizerTest { private MyTokenizer myTokenizer = new MyTokenizer(); private List expectedTokensForString = Arrays.asList( "Welcome" , "to" , "baeldung.com" ); private List expectedTokensForFile = Arrays.asList( "1" , "IND" , "India" , "2" , "MY" , "Malaysia" , "3", "AU" , "Australia" ); @Test public void givenString_thenGetListOfString() { String str = "Welcome,to,baeldung.com"; List actualTokens = myTokenizer.getTokens( str ); assertEquals( expectedTokensForString, actualTokens ); } @Test public void givenFile_thenGetListOfString() List actualTokens = myTokenizer.getTokensFromFile( "data.csv", " }

4. Kesimpulan

Dalam tutorial ringkas ini, kami melihat beberapa contoh praktikal menggunakan Java StringTokenizer teras .

Like always, the full source code is available over on GitHub.